设计模式代理

代理模式



设计原则:体现功能复用
常用场景:需要修改或屏蔽某一个或若干个类的部分功能,复用另外一部分功能,可使用静态代理,若是需要拦截一批类中的某些方法,在方法的前后插入一些一致的操作,假设这些类有一致的接口,可使用JDK的动态代理,否则可使用cglib
使用概率:99.99999%
复杂度:中高
变化点:静态代理没有变化点,动态代理的变化点为具有相同切入点的类
选择关键点:静态代理选择的关键点是是否要复用被代理的部分功能,动态代理选择的关键点在于能否在将被代理的这一批类当中,找出相同的切入点
逆鳞:切入点的不稳定
相关设计模式
适配器模式:对于适配器模式当中的定制适配器,它与静态代理有着相似的部分,
二者都有复用功能的作用,不同的是,静态代理会修改一部分原有的功能,而适配器往往是全部复用,而且在复用的同时,适配器还会将复用的类适配一个接口


主要思想
创建代理类继承或实现 需要被代理类相同的父类或接口
持有被代理类实例
调用被代理类方法在前后可增加功能

装饰模式,理论上装饰模式不控制持有的对象,只是增加一些装饰
代理模式,理论上被代理类是不可直接用的,持有代理对象,可控制其执行与否




public interface MyInterface {
    public void do1();
    public void do2();
}


public class MyClass implements MyInterface {
    @Override
    public void do1() {
        System.out.println("my do1");
    }

    @Override
    public void do2() {
        System.out.println("my do2");
    }
}


public class MyProxy implements MyInterface {

    private MyInterface myInterface;

    public MyProxy(MyInterface myInterface) {
        this.myInterface = myInterface;
    }

    @Override
    public void do1() {
        System.out.println("代理前1");
        myInterface.do1();
        System.out.println("代理后1");
    }

    @Override
    public void do2() {
        System.out.println("代理前2");
        //可以选择不执行   具有自主控制权
        //myInterface.do2();
        System.out.println("代理后2");
    }
}

 

posted on 2017-11-02 15:55  zjj911  阅读(142)  评论(0编辑  收藏  举报