`

代理 与 子类化

阅读更多

最近看一个斯坦福的视频, 里面的Cocoa框架大量使用了代理模式,定制类的行为,

 

学生就发问了,为什么不采用子类化的策略呢,

 

老师就说了 子类化 和 代理都是起到代码分离的作用。无所谓对错,有人喜欢子类化,有人喜欢代理,这是一个需要综合考虑的设计决策

 

 

自己写点东西记一下

 

package delegate.subclass;

public class UIApplication {

    Object view = new Object();

    public String draw() {
        return "draw a button on view" + view;
    }
}

 

package delegate.subclass;

public class UIApplicationSubclassA extends UIApplication {

    public String draw() {
        return "draw a text on view " + view;
    }
}
 
package delegate.subclass;

public class UIApplicationSubclassB extends UIApplication {
    
    public String draw() {
        return "draw a label on view " + view;
    }
    
}

 

 

 

package delegate.delegate;

public class UIApplcation {
    
    Object view;

    IViewController delegate;
    

    public void setDelegate (IViewController delegate ){
        this.delegate = delegate;
        view=delegate.getView();
    }
    
    public String draw(){
        return delegate.draw();
    }
}

 

package delegate.delegate;

public interface IViewController {
    String draw();
    Object getView();
}

 

 

package delegate.delegate;

public class AppDelegateA implements IViewController {

    Object view = new Object();

    @Override
    public String draw() {
        return "draw a text on view " + view;
    }

    @Override
    public Object getView() {
        return view;
    }

}
 
package delegate.delegate;

public class AppDelegateB implements IViewController {

    Object view = new Object();

    @Override
    public String draw() {
        return "draw a label on view " + view;
    }

    @Override
    public Object getView() {
        return view;
    }

}

 

 

 

 

package delegate;

import delegate.delegate.AppDelegateA;
import delegate.delegate.AppDelegateB;
import delegate.subclass.UIApplication;
import delegate.subclass.UIApplicationSubclassA;
import delegate.subclass.UIApplicationSubclassB;

public class Client {
    public static void main(String[] args) {
        System.out.println("test subclass---------------------");
        UIApplication sub1 =new UIApplicationSubclassA();
        System.out.println(sub1.draw());
        
        UIApplication sub2 =new UIApplicationSubclassB();
        System.out.println(sub2.draw());
        
        
        System.out.println("test delegate---------------------");
        delegate.delegate.UIApplcation app1 =new  delegate.delegate.UIApplcation();
        AppDelegateA delegateA= new AppDelegateA();
        app1.setDelegate(delegateA);
        System.out.println(app1.draw());
        
        delegate.delegate.UIApplcation app2 =new  delegate.delegate.UIApplcation();
        AppDelegateB delegateB= new AppDelegateB();
        app2.setDelegate(delegateB);
        System.out.println(app2.draw());
    }
}

 

 

 

console

test subclass---------------------
draw a text on view java.lang.Object@14318bb
draw a label on view java.lang.Object@ca0b6
test delegate---------------------
draw a text on view java.lang.Object@1b67f74
draw a label on view java.lang.Object@173a10f
 
分享到:
评论
4 楼 cczakai 2011-03-03  
一般是组合或者聚合 这种关系比继承关系要好些,组合模式不一样。

采用组合或者聚合有助于保持每个类被封装到单个任务上,这样类和继承的层次规模保持最小,不可能增长成为庞然大物。
3 楼 lcfred 2010-12-05  
组合总比继承好。。
2 楼 gdpglc 2010-12-05  
对delegate的翻译,比较习惯用委托。
看到你说代理,还以为是Proxy
1 楼 ustcfrank 2010-12-05  
有一条Design Principle: Favor composition over inheritance.

相关推荐

    代理模式 C++实现

    代理模式(Proxy) 定义: 为其他对象提供一种代理以控制对这个对象的访问 ...代理模式就是继承至同一父类的子类,在这些子类中我们选择一个代理类,这个代理类主要是用来处理其它子类相同功能不同实现的调用。

    Java 代理 代理模式 静态代理与动态代理 常见的动态代理实现 .md

    CGLIB通过动态生成子类的方式实现代理,适用于不能或不方便使用接口的情况。 #### 4. JDK Proxy与CGLIB的对比 - **JDK Proxy**: - 优点:实现简单,仅需要实现接口即可。 - 缺点:只能用于接口的代理。 - **...

    jdk与cglib动态度代理的区别原理

    2. **过程**:CGLIB使用`Enhancer`类作为入口,通过设置回调函数(Callback)和目标对象,生成代理子类。回调函数通常是一个实现了`MethodInterceptor`接口的对象,它在拦截方法调用时执行自定义逻辑。 3. **优点**...

    CGlib实现动态代理(承接上面JDK实现动态代理)

    此外,由于是通过子类化来实现,如果目标类的方法过多,可能会导致字节码生成效率降低。 总的来说,CGlib是一种强大的工具,尤其适用于那些没有实现接口或者不希望修改原有代码的场景。了解并熟练使用CGlib,可以...

    Java动态代理资源包

    3. **Final类的问题**:由于CGLIB是基于继承机制实现的,因此无法对声明为`final`的类进行代理,因为Java不支持子类化`final`类。 **CGLIB的使用步骤:** 1. **引入依赖**:在项目中添加CGLIB的依赖,通常通过Maven...

    spring+动态代理

    在Spring中,动态代理通常与AOP(面向切面编程)结合使用。AOP允许我们在程序执行过程中,在特定的“切点”插入自定义的行为,如日志、事务管理、权限控制等。Spring AOP通过动态代理机制来实现这些功能,使我们的...

    Python实现子类调用父类的初始化实例

    在Python的面向对象编程中,当我们创建一个子类并继承自父类时,有时需要在子类中调用父类的初始化方法(`__init__`),以确保父类的某些属性或功能得以正确初始化。这是因为子类可能会重写父类的`__init__`方法,...

    swift-一个Swift数据表包将UICollectionView子类化允许使用可扩展选项进行排序搜索和分页

    SwiftDataTables是一个专门为Swift开发者设计的数据表包,它基于UICollectionView进行了子类化,旨在提供更加灵活和功能丰富的数据展示解决方案。这个库的核心目标是简化在iOS应用中实现数据排序、搜索和分页的过程...

    动态代理和工厂方法例子

    工厂方法是创建型设计模式之一,它的主要目标是定义一个创建对象的接口,但让子类决定实例化哪一个类。这样,工厂方法可以使一个类的实例化延迟到其子类中进行,增强了代码的灵活性和可扩展性。在实际应用中,我们...

    jdk代理,cgib代理和spring后处理bean的关系

    本文将围绕“JDK代理”、“CGI代理”以及它们与Spring后处理Bean的关系进行深入探讨。 首先,JDK代理,也称为接口代理,是Java内置的一种动态代理机制。通过实现`java.lang.reflect.InvocationHandler`接口并调用`...

    cglib动态代理

    4. **动态子类化**:CGLib通过创建目标类的子类来实现动态代理。在运行时,当调用代理对象的方法时,CGLib会动态生成目标类的子类,并在这个子类中加入拦截逻辑。这种方法无需目标类实现任何接口,因此适用于不支持...

    动态代理和AOP详解

    2. CGLIB代理:当目标对象没有实现接口时,Spring会使用CGLIB库生成目标类的子类作为代理,通过覆盖方法并插入增强代码。 Spring AOP的切面由切点(Pointcut)和通知(Advice)组成。切点定义了何时应用通知,而...

    AOP之JDK动态代理和CGLib动态代理

    综上所述,AOP为软件设计带来了模块化和解耦的优势,Spring通过JDK动态代理和CGLib动态代理提供了灵活的实现。理解并掌握这两种代理方式,对于深入理解和有效利用Spring AOP至关重要。在实际开发中,根据业务需求和...

    解释Spring中的Aop代理

    AOP的核心思想是将关注点分离,即将横切关注点(如日志、事务)与业务逻辑分离,使得代码更加模块化,易于维护。切面是包含切点和通知的模块,切点定义了何处应用通知,而通知则定义了实际的行为。 2. Spring中的...

    JAVA的反射机制与动态代理

    Java的反射机制与动态代理是Java编程中两个非常重要的高级特性,它们在许多实际场景中发挥着关键作用,如框架开发、插件系统、元数据处理等。下面将详细讲解这两个概念及其应用。 首先,Java的反射机制允许我们在...

    Hibernate与代理模式.docx

    测试代码显示了创建代理对象与调用 `openFile` 之间的区别,证明了代理模式可以有效地延迟对象的初始化。 代理模式有以下几种类型: 1. 静态代理:如上述示例所示,代理类和原始类在编译时已经确定,代理类是显式...

    jdk动态代理和CGlib动态代理

    3. **ASM库**:CGlib底层使用ASM库来生成和操作字节码,从而实现动态子类化。 ### 示例代码 ```java import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import ...

    使用cglib演示动态代理时用到的jar包 aop 动态代理

    动态代理是实现AOP的一种方式,而在Java中,CGLIB(Code Generation Library)是一个常用的库,专门用于创建子类动态代理。下面我们将详细探讨AOP、动态代理以及CGLIB的相关知识点。 首先,AOP的核心概念是“切面”...

    springAop默认代理方式.zip

    在Spring AOP中,代理是实现切面的关键机制,它在目标对象与实际调用之间起到了中介作用,让我们来详细探讨Spring AOP的默认代理方式。 1. **静态代理**:Spring AOP 提供了两种代理方式,一种是静态代理,另一种是...

    java动态代理(JDK和cglib).pdf

    Java 动态代理是Java语言中的一个重要特性,它允许我们在...这在设计模式中被称为代理模式,对于构建复杂、模块化的系统具有重要作用。了解和熟练使用这两种动态代理技术,可以极大地提升Java开发的效率和代码质量。

Global site tag (gtag.js) - Google Analytics