代理模式

Posted CoderBuff

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代理模式相关的知识,希望对你有一定的参考价值。

代理模式,在UML类结构上很好理解, 不过在实际应用当中可能并不是很清楚代理模式应用在哪些场景里。这里给出《大话设计模式》中对代理模式应用场合的解释:

第一,远程代理,也就是为一个对象在不同地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。

第二,虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。

第三,安全代理,用来控制真实对象访问时的权限。

第四,智能指引,是指当调用真实对象的对象时,代理处理另外一些事。(这里和动态代理类似)

我们画出动态代理的UML类结构图。

技术分享

可以看出代理模式的UML类结构非常简单。

真实实体和代理共有的接口代码如下:

 1 package day_7_proxy;
 2 
 3 /**
 4  * 真实实体和代理共有的接口
 5  * @author turbo
 6  *
 7  * 2016年9月11日
 8  */
 9 public interface Subject {
10     
11     void request();
12 }

真实实体和代理类代码,在真实实体中做真正要做的动作,而在代理中并不需要做真正的动作,仅仅是调用真实实体的方法动作即可。

 1 package day_7_proxy;
 2 
 3 /**
 4  * 真实实体
 5  * @author turbo
 6  *
 7  * 2016年9月11日
 8  */
 9 public class RealSubject implements Subject {
10 
11     /* (non-Javadoc)
12      * @see day_7_proxy.Subject#request()
13      */
14     @Override
15     public void request() {
16         System.out.println("真实的访问");
17     }
18 
19 }
 1 package day_7_proxy;
 2 
 3 /**
 4  * 代理类
 5  * @author turbo
 6  *
 7  * 2016年9月11日
 8  */
 9 public class Proxy implements Subject {
10     private RealSubject realSubject;
11     
12     /* (non-Javadoc)
13      * @see day_7_proxy.Subject#request()
14      */
15     @Override
16     public void request() {
17         if (realSubject == null){ 
18             realSubject = new RealSubject();
19         }
20         
21         realSubject.request();
22     }
23 
24 }

客户端代码:

 1 package day_7_proxy;
 2 
 3 /**
 4  * @author turbo
 5  *
 6  * 2016年9月11日
 7  */
 8 public class Main {
 9     public static void main(String[] args){
10         Proxy proxy = new Proxy();
11         proxy.request();
12     }
13 }

这样我们就简单的实现了一个代理模式。同样也没有详细深入的讲解,在以后会结合更加实际的代码,或者开源框架代码来实际领会代理模式的威力。

Java中还有一个动态代理,后面我们会说下这个动态代理是个什么东西。

 

以上是关于代理模式的主要内容,如果未能解决你的问题,请参考以下文章

scrapy按顺序启动多个爬虫代码片段(python3)

用于从 cloudkit 检索单列的代码模式/片段

java代码实现设计模式之代理模式

代理模式(静态代理动态代理)代码实战(详细)

Java设计模式-代理模式之动态代理(附源代码分析)

代理模式(静态代理)