文档章节

Java设计模式 - 代理模式

那只是一股逆流
 那只是一股逆流
发布于 2016/11/24 09:11
字数 1452
阅读 29
收藏 1

1、什么是代理模式:

  为另一个对象提供一个替身或占位符以访问这个对象。

 

2、代理模式有什么好处:

  (1)延迟加载  

    当你需要从网络上面查看一张很大的图片时,你可以使用代理模式先查看它的缩略图看是否是自己想要的图片。

  (2)对访问进行控制

    代理模式为另一个对象提供代表,以便控制客户对对象的访问。

    比如用户需要查看某些重要文件时,你可以使用代理模式首先检查这个用户是否有这个权限。

  (3)降低耦合度,增加系统的弹性和可扩展性

    因为用户持有的是代理对象的引用并不是执行用户请求的对象,所以它实现了调用者与被调用者的完全解耦!

    (4)...

  

 

3、代理模式的结构:

  UML:

    

 示意图:

    

 

  为什么代理对象和真正的对象要实现同一个接口?

  实现了同一个接口就可以保证只要能够使用真正做事对象的地方就能够用代理对象代替!

 

 

4、代理模式中的角色:

  (1)代理对象(Proxy)

 

    保存一个引用使得代理可以访问实体;

    实现与Subject接口,这样代理就能在使用真正对象的地方使用代理对象;

    控制对象的存取,并可能负责创建和删除它。

  (2)主题接口(Subject):

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

  (3)真正对象(RealSubject);

    定义被Proxy代理的对象。

 

5、应用举例:

  现在小王同学要买一张回家的火车票,于是他来到了火车票代售点来买票。到了代售点他告诉阿姨他要买回家的火车票,阿姨顺利的帮小王买到了回家的车票。

  现在我们来分析一下阿姨帮小王买到车票的过程:实际上代售点是不卖票的,真正卖票的是火车站。

  流程示意图:

    

 

package com.tony.proxy; 
/**
 * Subject:Proxy和RealSubject必须实现此接口 
 * 提供售票操作 
 */
public interface Subject { 
     void soldTickets(); 
}

 

package com.tony.proxy;  
/**
 *
 * 代售点(Proxy):持有真正做事对象的引用  
 */
public class Proxy implements Subject {  
    private Subject realSubject;   
    public Proxy(){ 
        realSubject = new RealSubject(); 
   }
   @Override 
   public void soldTickets() { 
       System.out.println("代售点:有顾客需要买火车票..."); 
       realSubject.soldTickets(); 
       System.out.println("代售点:正在出票..."); 
  }     
}
 
package com.tony.proxy;  
/**
 *
 * 火车站(RealSubject):真正处理请求的对象  
 */
public class RealSubject implements Subject {   
    @Override 
    public void soldTickets() { 
         System.out.println("火车站:已接收到订单,允许出票..."); 
    } 
}
 
package com.tony.proxy;  

public class Client {   
    private Subject proxy;     
    public Client(){  
        proxy = new Proxy();  
    }
    public void buyTickets(){ 
        System.out.println("小王:我要买票..."); 
        proxy.soldTickets(); 
        System.out.println("小王:已买到票...");
    }     
}
 
package com.tony.proxy; 

public class Test { 
    public static void main(String[] args) { 
        Client c = new Client(); 
        c.buyTickets(); 
    } 
}

  因为火车站的售票系统很重要,不能让所有人都能对它直接进行操作,所以火车站弄一个安全的代理(代售点)。想买票,没问题,去我的代理那里买我不直接对你们售票。这就在一定程度上保障了售票系统的安全。这也是使用代理模式的一个好处:对访问进行控制,只对有权限的对象开放。

 

6、代理模式与其他模式的区别:

  (1)与装饰者模式的区别:

    大家可能会发现两种模式的UML图几乎一致,是不是意味着这两种模式可以相互代替呢?

    不可以!两种模式的目的不一样:

    装饰者的目的是为对象增加新的功能,而代理则是控制对某个对象的访问!

  (2)与适配器模式的区别:

    代理模式和适配器模式都是挡在其他对象的前面,并负责将请求转发给它们。

    但是它们在结构上不一样:适配器会改变对象适配的接口,而代理则实现相同的接口。

  

7、代理模式的缺点:

  (1)在客户端和目标对象增加一个代理对象,会造成请求处理速度变慢,影响系统性能。

  (2)增加了系统的复杂度。就和其他的包装者(wrapper)一样,代理会造成你的设计中类的数目增加。

 

8、总结:

  代理模式虽然会影响性能,但是它又会给我们带来很多好处:它可以对某个对象进行访问控制,提高系统的安全性;它可以是调用者和被调用者实现完全的解耦,提高了系统的弹性。在程序设计的时候我们必须要在系统性能和程序的安全性,可扩展性等进行权衡:想要设计出好的程序,牺牲一些性能也是值得的!

  代理模式还是面向切面编程的基础!

  代理模式的应用非常广泛,几乎所有优秀的开源框架都用了:Spring、myBatis、Struts2等等。

  所以要想设计出优秀的程序必须要掌握代理模式。

 

  代理模式有许多变体,例如:缓存代理、同步代理、防火墙代理和写入时复制代理、智能引用代理、复杂隐藏代理。

  代理模式的一个分支 —— 动态代理在我们平时编程经常用到,因为它给了我们程序的极大的灵活性。下一篇文章我将会对动态代理进行详细的解释。

 

参考资料:

  《Head First 设计模式》
  《设计模式》

© 著作权归作者所有

共有 人打赏支持
那只是一股逆流
粉丝 9
博文 22
码字总数 26214
作品 0
南岸
后端工程师
私信 提问
从 Java 到 Scala (三): object 的应用

本文由 Captain 发表在 ScalaCool 团队博客。 在上篇 Java 到 Scala 系列中,我想你或多或少在语言特性上对有了一定的掌握,在了解完它酷酷的语言特性——让静态回归常态并能简单运用其衍生出...

ScalaCool
09/10
0
0
20个设计模式和软件设计面试问题

不管是参加Java面试还是C#面试,设计模式和软件设计都是任何编程面试中的必问问题。实际上,编程能力和设计技巧是对彼此很好的补充。一个好的程序员通常都是一个好的软件设计人员。他们知道怎...

LCZ777
2014/08/13
0
0
设计模式 2014-12-19

book: 阎宏《JAVA与模式》 架构设计栏目 http://blog.csdn.net/enterprise/column.html 概要: http://bbs.csdn.net/forums/Embeddeddriver 23种设计模式分别是: 1.单例模式 2.工厂方法模式...

jayronwang
2014/12/19
0
0
设计模式15——Template Method设计模式

Template Method模板方法设计模式定义一个操作中算法的骨架,将具体步骤的执行延迟到子类中实现。Java中的抽象类就是使用了模板方法设计模式。模板方法设计模式结构如下: 以文档处理为例,T...

小米米儿小
2014/01/24
0
0
设计模式知识汇总(附github分享)

写在前面 主要内容 为了更系统的学习设计模式,特地开了这样一个基于Java的设计模式【集中营】,都是笔者在实际工作中用到过或者学习过的一些设计模式的一些提炼或者总检。慢慢地初见规模,也...

landy8530
10/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周二乱弹 —— 请上车吧

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @2amor :分享王菲的单曲《闷》 《闷》- 王菲 手机党少年们想听歌,请使劲儿戳(这里) @開源中國周杰倫 :昨天睡觉肚子疼,妈蛋,半夜爬起来...

小小编辑
31分钟前
161
6
工作中如何做好技术积累

参考:https://tech.meituan.com/study_vs_work.html 看了这篇文章,觉得总结得非常好,因此摘抄了一些关键点,以便自己经常翻阅。 引言 在繁忙的工作中做好技术积累,构建个人核心竞争力. 在...

grace_233
41分钟前
6
0
day146-2018-11-13-英语流利阅读-待学习

5 岁“牛娃”简历给 985 精英一个暴击 Lala 2018-11-13 1.今日导读 “不要让孩子输在起跑线上”,似乎已成为了当下最流行的名句,每个身为家长或还未成为家长的人都不得不思考这句话的分量。...

飞鱼说编程
54分钟前
4
0
Mariadb二进制包安装,Apache安装

安装mariadb 下载二进制包并解压 [root@test-a src]# wget https://downloads.mariadb.com/MariaDB/mariadb-10.2.6/bintar-linux-glibc_214-x86_64/mariadb-10.2.6-linux-glibc_214-x86_64.t......

野雪球
今天
4
0
ConcurrentHashMap 高并发性的实现机制

ConcurrentHashMap 的结构分析 为了更好的理解 ConcurrentHashMap 高并发的具体实现,让我们先探索它的结构模型。 ConcurrentHashMap 类中包含两个静态内部类 HashEntry 和 Segment。HashEnt...

TonyStarkSir
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部