代理模式

代理模式

       给某一个对象提供一个代理对象,并有代理对象控制对原对象的引用。所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。

      

1.1代理种类

1.1.1远程(Remote)代理

       为一个位于不同地址空间的对象提供一个局域代表对象,远程代理又叫大使。

1.1.2虚拟代理

       根据需要创建一个资源消耗较大的对象,使得此对象只在需要时才会被真正创建。

1.1.3Copy-on-Write代理

       虚拟代理的一种,把复制(克隆)拖延到只有在客户端需要时,才真正采取行动。

1.1.4保护代理

       控制对一个对象的访问,可以给不同的用户提供不同级别的使用权限。

1.1.5Cache代理

       为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。

1.1.6防火墙代理

       保护目标,不受恶意用户接近。

1.1.7同步化代理

       使几个用户同时使用一个对象而没有冲突。

1.1.8智能引用代理

       当一个对象被引用时,提供一些额外的操作。

 

1.2结构

       抽象主题角色:声明了真实主题和代理主题的共同接口,使任何可以使用真实主题的地方都可以使用代理主题。

       代理主题(Proxy)角色:代理主题角色含有对真实主题角色的引用。

       真实主题角色:代理角色所代表的真实对象。

 

 抽象主题角色:

/**
 * 抽象主题角色
 */
public interface Subject {

    /**
     * 业务操作
     */
    void operate();
}

 

真实主题角色:

/**
 * 真实主题角色
 */
public class RealSubject implements Subject {
    @Override
    public void operate() {
        System.out.println("real operate ...");
    }
}

 

代理主题角色:

/**
 * 代理主题角色
 */
public class ProxySubject implements Subject{

    private Subject realSubject;

    private void beforeOperate(){
        System.out.println("proxy before operate ...");
    }
    private void afterOperate(){
        System.out.println("proxy after operate ...");
    }

    @Override
    public void operate() {
        System.out.println("proxy operate ...");
        beforeOperate();
        if(realSubject == null){
            realSubject = new RealSubject();
        };
        realSubject.operate();
        afterOperate();
    }
}

 

客户端:

public class Client {
    public static void main(String[] args) {
        Subject sub = new ProxySubject();
        sub.operate();
    }
}

 

 

小结:

  代理模式模式的种类有很多,但他们有个共同点,就是代理角色和真实角色实现了相同的接口或者继承了同一个类。代理角色持有真实角色的引用对象,客户端请求代理角色,代理角色将请求委派给真实角色,同时,代理角色可以在真实角色处理的前后添加增强功能。

 

 

 

 

 

参考:

  《Java与模式》

posted @ 2018-11-28 21:38  Simple°  阅读(113)  评论(0编辑  收藏  举报