文档章节

Java设计模式 - 代理模式

那只是一股逆流
 那只是一股逆流
发布于 2016/11/24 09:11
字数 1452
阅读 26
收藏 1
点赞 0
评论 0

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
南岸
后端工程师
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
简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别

转载:原地址http://www.cnblogs.com/zhangchenliang/p/3700820.html 简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别 结合简单示例和UML图,讲解工厂模式简单原理。 一、引子 话说...

法斗斗
05/08
0
0
设计模式3——Proxy设计模式

Proxy代理设计模式是一种控制对象访问的设计模式,类似于网络代理,网络代理机制如下图: Proxy代理设计模式机制如下: 代理模式UML图如下: 代理模式顺序图如下: 客户端程序通过代理程序来...

小米米儿小
2013/12/06
0
0
Java设计模式 create FactoryMethod

工厂模式是我们最常用的模式了,著名的Jive论坛,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。 为什么工厂模式是如此常用?因为工厂模式就相当于创建实例对象的new,我们经...

神勇小白鼠
2011/05/18
0
0
23种设计模式(1):单例模式

定义:确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。 类型:创建类模式 类图: 类图知识点: 1.类图分为三部分,依次是类名、属性、方法 2.以<<开头和以>>结尾的为注释...

LCZ777
2014/07/05
0
0
groovy 闭包【命令模式】

在Java编程世界,有两个设计模式又简单、又常用,而且实现方式也很相似,这就是命令模式和策略模式。 有关这两个模式的讲解,在网络上真是汗牛充栋,大家可以随便搜索一下,就是一大堆。 可以...

k_k_anna
2015/01/20
0
0
JavaScript设计模式系列三之单例模式(附案例源码)

文章初衷 设计模式其实旨在解决语言本身存在的缺陷 目前javaScript一些新的语法特性已经集成了一些设计模式的实现, 大家在写代码的时候,没必要为了用设计模式而去用设计模式, 那么我这边为什...

小钱钱阿圣
2017/09/22
0
0
为什么java中用枚举实现单例模式会更好

枚举单例是java中使用枚举提供一个实例对象来实现单例模式的一种新方法,虽然单例模式在java中早已存在,但枚举单例实际上从java5引入枚举作为它的关键特性之后相对来说还是一个新的概念,这...

zhoujy
2013/06/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Git 2.18版本发布:支持Git协议v2,提升性能

Git 2.18版本发布:支持Git协议v2,提升性能Git 2.18版本发布:支持Git协议v2,提升性能 新版本协议的主要驱动力是使 Git 服务端能够对各种 ref(分支与 tag)进行过滤操作。 这就意味着,G...

linux-tao
29分钟前
0
0
python浏览器自动化测试库【2018/7/22-更新】

64位py2.7版本 更新 document_GetResources 枚举页面资源 document_GetresourceText 获取指定url的内容 包括页面图片 下载地址下载地址 密码:upr47x...

开飞色
46分钟前
28
0
关于DCL双重锁失效及解决方案

关于DCL双重锁失效及解决方案 Double Check Lock (DCL)实现单例 DCL 方式实现单例的优点是既能够在需要时才初始化单例,又能够保证线程安全,且单例对象初始化后调用getInstance方法不进行...

DannyCoder
52分钟前
0
0
PowerDesigner 16.5 安装配置

PowerDesigner16.5破解版是一款业内领先且开发人员常用的数据库建模工具,PowerDesigner可以从物理和概念两个层面设计数据库,方便用户制作处清晰直观的数据流程图和结构模型,欢迎有需要的朋...

Gibbons
今天
0
0
mac Homebrew 指令积累

1通用命令 brew install [包名] //安装包 brew list //列举安装的包 brew info [包名] // 显示安装包的详细信息 mysql 相关 #启动mysql 服务 brew service start mysql my...

Kenny100120
今天
0
0
前端Tips: 创建, 发布自己的 Vue UI 组件库

创建, 发布自己的 Vue UI 组件库 前言 在使用 Vue 进行日常开发时, 我们经常会用到一些开源的 UI 库, 如: Element-UI, Vuetify 等. 只需一行命令, 即可方便的将这些库引入我们当前的项目: n...

ssthouse_hust
今天
1
0
大数据教程(2.13):keepalived+nginx(多主多活)高可用集群搭建教程【自动化脚本】

上一章节博主为大家介绍了目前大型互联网项目的keepalived+nginx(主备)高可用系统架构体系,相信大家应该看了博主的文章对keepalived/nginx技术已经有一定的了解,在本节博主将为大家分享k...

em_aaron
今天
5
0
Git 2.18版本发布:支持Git协议v2,提升性能

在最新的官方 Git 客户端正式版2.18中添加了对 Git wire 协议 v2 的支持,并引入了一些性能与 UI 改进的新特性。在 Git 的核心团队成员 Brandon Williams 公开宣布这一消息前几周,Git 协议 ...

六库科技
今天
0
0
Java8新特性之接口

在JDK8以前,我们定义接口类中,方法都是抽象的,并且不能存在静态方法。所有的方法命名规则基本上都是 public [返回类型] [方法名](参数params) throws [异常类型] {}。 JDK8为接口的定义带...

developlee的潇洒人生
今天
0
0
aop + annotation 实现统一日志记录

aop + annotation 实现统一日志记录 在开发中,我们可能需要记录异常日志。由于异常比较分散,每个 service 方法都可能发生异常,如果我们都去做处理,会出现很多重复编码,也不好维护。这种...

长安一梦
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部