浅谈Java设计模式——代理模式(Proxy)

一、概述

         为其他对象提供一种代理以控制对这个对象的访问。代理模式就是给一个对象提供一个代理,并由代理对象控制对原对象的引用。它使得客户不能直接与真正的目标对象通信。代理对象是目标对象的代表,其他需要与这个目标对象打交道的操作都是和这个代理对象在交涉。代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了的作用和保护了目标对象的,同时也在一定程度上面减少了系统的耦合度。

二、使用场景

1.远程访问:为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。

2.虚拟代理:根据需求创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。

3.安全代理:用来控制真实对象访问时的权限。

4.智能指引:调用真实的对象时,代理处置另外一些事。

三、参与者

1.Proxy 保存一个引用使得代理可以访问实体。若RealSubject和Subject的接口相同,Proxy会引用Subject。 提供一个与Subject的接口相同的接口,这样代理就可以用来替代实体。 控制对实体的存取,并可能负责创建和删除它。 其他功能依赖于代理的类型:

2.RemoteProxy负责对请求及其参数进行编码,并向不同地址空间中的实体发送已编码的请求。 

3.VirtualProxy可以缓存实体的附加信息,以便延迟对它的访问。 

4.ProtectionProxy检查调用者是否具有实现一个请求所必需的访问权限。

5.Subject 定义RealSubject和Proxy的共用接口,这样就在任何使用RealSubject的地方都可以使用Proxy。 

6.RealSubject 定义Proxy所代表的实体。

四、类图

五、代码示例

1.Subject:

/**
 * Subject
 * @author zhipeng_Tong
 */
public interface Subject {
    void active();
}

2.RealSubject:

/**
 * RealSubject
 * @author zhipeng_Tong 
 */
public class RealSubject implements Subject {
    @Override
    public void active() {
        System.out.println("------------------------");
        System.out.println("被代理类 RealSubject....");
        System.out.println("------------------------");
    }
}

3.Proxy:

/**
 * Rroxy
 * @author zhipeng_Tong 
 */
public class Proxy implements Subject {
    private Subject subject;

    public Proxy() {
        System.out.println("代理类 Proxy 被初始化...");
        this.subject = new RealSubject();
    }

    @Override
    public void active() {
        System.out.println("代理开始");
        subject.active();
        System.out.println("代理结束");
    }
}

4.测试代码

public class Client {
    public static void main(String[] args) {
        Proxy proxy = new Proxy();
        proxy.active();
    }
}

运行结果:

代理类 Proxy 被初始化...
代理开始
------------------------
被代理类 RealSubject....
------------------------
代理结束
原文地址:https://www.cnblogs.com/IdealSpring/p/11871173.html