Back to Posts

设计模式——代理模式与装饰者的关系

Posted in DesignPattern

基于包装者的代理

代理模式,实际上和前一篇的装饰者模式有些相似,实际上都是对既有方法的一些扩展;对于如果实现,两者也是类似的:

  1. 将被代理(被装饰)的类,作为代理类(装饰类)的构造器参数
  2. 在构造器中将被代理(被装饰)的类初始化
  3. 由代理类的方法对被代理类做扩展
package com.git.poan;

/**
 * Created by poan on 2018/04/03.
 */
public class ProxyTest {

    public static void main(String[] args) {
        Clerk clerk = new Clerk(new Boss());
        clerk.meeting();
    }

}

// 这里节省篇幅,就不把meeting提取到接口让Boss和Clerk去实现了
class Boss {

    public void meeting() {
        System.out.println("不错不错");
    }

}

class Clerk {

    private Boss boss;

    public Clerk(Boss boss) {
        this.boss = boss;
    }

    public void meeting() {

        System.out.println("会议开始:");
        for (int i = 0; i < 10; i++) {
            System.out.println("!@#$$%^^&*");
        }
        boss.meeting();
        System.out.println("会议结束");
    }

}

动态代理

面试问Spring的AOP的,实际上就是一个代理模式,在切面的前后为切面方法做扩展,只不过Spring的AOP用的是动态代理实现的;

  • InvocationHandler
    可以通过实现Java的InvocationHandler接口,然后invoke方法中会对切面方法做预处理然后调用切面方法
  • CGLIB CGLIB则不用实现接口,直接生成切面类的子类字节码(所以切面类不能是final类),动态扩展父类的方法。

你看那个人好像一条狗啊

Read Next

设计模式——装饰者模式IO流