最近看一个斯坦福的视频, 里面的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
分享到:
相关推荐
代理模式(Proxy) 定义: 为其他对象提供一种代理以控制对这个对象的访问 ...代理模式就是继承至同一父类的子类,在这些子类中我们选择一个代理类,这个代理类主要是用来处理其它子类相同功能不同实现的调用。
CGLIB通过动态生成子类的方式实现代理,适用于不能或不方便使用接口的情况。 #### 4. JDK Proxy与CGLIB的对比 - **JDK Proxy**: - 优点:实现简单,仅需要实现接口即可。 - 缺点:只能用于接口的代理。 - **...
2. **过程**:CGLIB使用`Enhancer`类作为入口,通过设置回调函数(Callback)和目标对象,生成代理子类。回调函数通常是一个实现了`MethodInterceptor`接口的对象,它在拦截方法调用时执行自定义逻辑。 3. **优点**...
此外,由于是通过子类化来实现,如果目标类的方法过多,可能会导致字节码生成效率降低。 总的来说,CGlib是一种强大的工具,尤其适用于那些没有实现接口或者不希望修改原有代码的场景。了解并熟练使用CGlib,可以...
3. **Final类的问题**:由于CGLIB是基于继承机制实现的,因此无法对声明为`final`的类进行代理,因为Java不支持子类化`final`类。 **CGLIB的使用步骤:** 1. **引入依赖**:在项目中添加CGLIB的依赖,通常通过Maven...
在Spring中,动态代理通常与AOP(面向切面编程)结合使用。AOP允许我们在程序执行过程中,在特定的“切点”插入自定义的行为,如日志、事务管理、权限控制等。Spring AOP通过动态代理机制来实现这些功能,使我们的...
在Python的面向对象编程中,当我们创建一个子类并继承自父类时,有时需要在子类中调用父类的初始化方法(`__init__`),以确保父类的某些属性或功能得以正确初始化。这是因为子类可能会重写父类的`__init__`方法,...
SwiftDataTables是一个专门为Swift开发者设计的数据表包,它基于UICollectionView进行了子类化,旨在提供更加灵活和功能丰富的数据展示解决方案。这个库的核心目标是简化在iOS应用中实现数据排序、搜索和分页的过程...
工厂方法是创建型设计模式之一,它的主要目标是定义一个创建对象的接口,但让子类决定实例化哪一个类。这样,工厂方法可以使一个类的实例化延迟到其子类中进行,增强了代码的灵活性和可扩展性。在实际应用中,我们...
本文将围绕“JDK代理”、“CGI代理”以及它们与Spring后处理Bean的关系进行深入探讨。 首先,JDK代理,也称为接口代理,是Java内置的一种动态代理机制。通过实现`java.lang.reflect.InvocationHandler`接口并调用`...
4. **动态子类化**:CGLib通过创建目标类的子类来实现动态代理。在运行时,当调用代理对象的方法时,CGLib会动态生成目标类的子类,并在这个子类中加入拦截逻辑。这种方法无需目标类实现任何接口,因此适用于不支持...
2. CGLIB代理:当目标对象没有实现接口时,Spring会使用CGLIB库生成目标类的子类作为代理,通过覆盖方法并插入增强代码。 Spring AOP的切面由切点(Pointcut)和通知(Advice)组成。切点定义了何时应用通知,而...
综上所述,AOP为软件设计带来了模块化和解耦的优势,Spring通过JDK动态代理和CGLib动态代理提供了灵活的实现。理解并掌握这两种代理方式,对于深入理解和有效利用Spring AOP至关重要。在实际开发中,根据业务需求和...
AOP的核心思想是将关注点分离,即将横切关注点(如日志、事务)与业务逻辑分离,使得代码更加模块化,易于维护。切面是包含切点和通知的模块,切点定义了何处应用通知,而通知则定义了实际的行为。 2. Spring中的...
Java的反射机制与动态代理是Java编程中两个非常重要的高级特性,它们在许多实际场景中发挥着关键作用,如框架开发、插件系统、元数据处理等。下面将详细讲解这两个概念及其应用。 首先,Java的反射机制允许我们在...
测试代码显示了创建代理对象与调用 `openFile` 之间的区别,证明了代理模式可以有效地延迟对象的初始化。 代理模式有以下几种类型: 1. 静态代理:如上述示例所示,代理类和原始类在编译时已经确定,代理类是显式...
3. **ASM库**:CGlib底层使用ASM库来生成和操作字节码,从而实现动态子类化。 ### 示例代码 ```java import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import ...
动态代理是实现AOP的一种方式,而在Java中,CGLIB(Code Generation Library)是一个常用的库,专门用于创建子类动态代理。下面我们将详细探讨AOP、动态代理以及CGLIB的相关知识点。 首先,AOP的核心概念是“切面”...
在Spring AOP中,代理是实现切面的关键机制,它在目标对象与实际调用之间起到了中介作用,让我们来详细探讨Spring AOP的默认代理方式。 1. **静态代理**:Spring AOP 提供了两种代理方式,一种是静态代理,另一种是...
Java 动态代理是Java语言中的一个重要特性,它允许我们在...这在设计模式中被称为代理模式,对于构建复杂、模块化的系统具有重要作用。了解和熟练使用这两种动态代理技术,可以极大地提升Java开发的效率和代码质量。