给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。

代理的种类:
1. 远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代表对象。这个不同的地址空间可以是在本机器中,也可是在另一台机器中。
2. 虚拟(Virtual)代理:根据需要创建一个资源消耗较大的对象,使得此对象只在需要时才会被真正创建。
3. Copy-on-Write代理:虚拟代理的一种。把复制(克隆)拖延到只有在客户端需要时,才真正采取行动。
4. 保护(Protect or Access)代理:控制对一个对象的访问,如果需要,可以给不同的用户提供不同级别的使用权限。
5. Cache代理:为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。
6. 防火墙(Firewall)代理:保护目标,不让恶意用户接近。
7. 同步化(Synchronization)代理:使几个用户能够同时使用一个对象而没有冲突。
8. 智能引用(Smart Reference)代理:当一个对象被引用时,提供一些额外的操作,比如将对此对象调用的次数记录下来等。

示意类图








1. com.cleversoft.designpatterns.proxy.Subject.java:
package com.cleversoft.designpatterns.proxy;

public interface Subject {
    
public void request();
}

2. com.cleversoft.designpatterns.proxy.RealSubject.java:
package com.cleversoft.designpatterns.proxy;

public class RealSubject implements Subject {

    
public void request() {
        System.out.println(
"From real subject");

    }


}

3. com.cleversoft.designpatterns.proxy.ProxySubject.java:
package com.cleversoft.designpatterns.proxy;

public class ProxySubject implements Subject {
    
private RealSubject realSubject;

    
public ProxySubject() {
    }


    
public void request() {
        preRequest();

        
if (realSubject == null{
            realSubject 
= new RealSubject();
        }

        realSubject.request();

        postRequest();
    }


    
private void postRequest() {
        System.out.println(
"From post request");

    }


    
private void preRequest() {
        System.out.println(
"From pre request");

    }


}

4. com.cleversoft.designpatterns.proxy.Client.java:
package com.cleversoft.designpatterns.proxy;

public class Client {
    
private static Subject subject;

    
public static void main(String[] args) {
        subject 
= new ProxySubject();
        subject.request();
    }


}


参考资料:
1. 《Java与模式》

欢迎大家访问我的个人网站 萌萌的IT人