Java设计模式 - 代理模式

时间:2022-09-10 22:06:18

1、什么是代理模式:

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

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

  (1)延迟加载

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

  (2)对访问进行控制

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

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

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

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

   (4)...

  

3、代理模式的结构:

  UML:

    Java设计模式 - 代理模式

 示意图:

    Java设计模式 - 代理模式

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

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

4、代理模式中的角色:

  (1)代理对象(Proxy)

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

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

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

  (2)主题接口(Subject):

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

  (3)真正对象(RealSubject);

    定义被Proxy代理的对象。

5、应用举例:

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

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

  流程示意图:

    Java设计模式 - 代理模式

 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();
}
}

Java设计模式 - 代理模式

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

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

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

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

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

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

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

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

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

  

7、代理模式的缺点:

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

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

8、总结:

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

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

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

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

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

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

  其他模式:设计模式专栏

参考文献:

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

Java设计模式 - 代理模式的更多相关文章

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

    Java设计模式-代理模式之动态代理(附源代码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的差别就是:动态代理是在执行时刻动态的创建出代理类及其对象. 上篇中的静态代 ...

  2. JAVA 设计模式 代理模式

    用途 代理模式 (Proxy) 为其他对象提供一种代理以控制对这个对象的访问. 代理模式是一种结构型模式. 结构

  3. Java设计模式の代理模式

    目录  代理模式 1.1.静态代理   1.2.动态代理 1.3.Cglib代理 代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是 ...

  4. Java设计模式—代理模式

    代理模式(Proxy Pattern)也叫做委托模式,是一个使用率非常高的模式. 定义如下:     为其他对象提供一种代理以控制对这个对象的访问. 个人理解:        代理模式将原类进行封装, ...

  5. Java设计模式——代理模式实现及原理

    简介 Java编程的目标是实现现实不能完成的,优化现实能够完成的,是一种虚拟技术.生活中的方方面面都可以虚拟到代码中.代理模式所讲的就是现实生活中的这么一个概念:中介. 代理模式的定义:给某一个对象提 ...

  6. Java设计模式-代理模式(Proxy)

    其实每个模式名称就表明了该模式的作用,代理模式就是多一个代理类出来,替原对象进行一些操作,比如我们在租房子的时候回去找中介,为什么呢?因为你对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人去帮你 ...

  7. Java设计模式--代理模式+动态代理+CGLib代理

    静态代理 抽象主题角色:声明真实主题和代理主题的共同接口. 代理主题角色:代理主题内部含有对真实主题的引用,从而在任何时候操作真实主题对象:代理主题提供一个与真实主题相同的接口,以便在任何时候都可以代 ...

  8. Java设计模式——代理模式

    public interface People { public void work(); } public class RealPeople implements People { public v ...

  9. Java 之 设计模式——代理模式

    设计模式——代理模式 一.概述 1.代理模式 (1)真实对象:被代理的对象 (2)代理对象:代理真实对象的 (3)代理模式:代理对象代理真实对象,达到增强真实对象功能的目的 二.实现方式 1.静态代理 ...

随机推荐

  1. AFNetworking使用

    1.访问网络获取Json //Get方法 NSString *str = @"http://api.xxx.cc/product/found.jhtml"; NSDictionar ...

  2. 关于 终端 ls 命令 不能区分文件和目录的问题

    默认的,使用ls命令来显示目录内容的时候,“终端”对于目录.可执行文件等特殊类型的文件并没有使用颜色来显示,只有使用“ls -G”时,才能显示颜色,这可真是不方便.有没有方法可以默认显示颜色呢?方法当 ...

  3. cocos2D(八)---- CCMenu && CCMenuItem

    些菜单项让用户開始游戏.暂停\继续游戏.打开\关闭音乐或者是返回到上一个界面,比方以下两张图中用红色线框标记的菜单项     我们能够使用CCMenu和CCMenuItem实现上述的菜单功能,CCMe ...

  4. CSS学习笔记:利用border绘制三角形

    在前端的笔试.面试过程中,经常会出现一些不规则图形的CSS设置,基本上多是矩形外加一个三角形.利用CSS属性可以实现三角形的生成,主要利用上下左右的边距的折叠. 1.第一种图形: .box { wid ...

  5. jquery无缝滚动效果实现

    demo如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  6. telnetlib 中各种 read 函数的意义

    基本原理 要明白 telnetlib 中各个 read 函数的意义,首先要了解 telnetlib 的工作原理. telnetlib 首先通过 socket 连接从网络接收数据,把数据存储到自己的 r ...

  7. 总结:独立开发 jar 包组件——功能主要是支持查询数据库的所有表数据

    前言:开发完一个项目,必定总结,这次就将总结记录在博客,第一次开发组件 jar 包,包含前端,后台,中间遇到好多问题,这里一一描述.转载请注明出处: https://www.cnblogs.com/y ...

  8. 第三百五十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—将bloomfilter&lpar;布隆过滤器&rpar;集成到scrapy-redis中

    第三百五十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—将bloomfilter(布隆过滤器)集成到scrapy-redis中,判断URL是否重复 布隆过滤器(Bloom Filter)详 ...

  9. 八、springcloud之服务网关zuul(一)

    一.Zuul简介 zuul 是netflix开源的一个API Gateway 服务器, 本质上是一个web servlet应用. Zuul是Netflix出品的一个基于JVM路由和服务端的负载均衡器. ...

  10. 在jenkins和sonar中集成jacoco&lpar;一&rpar;--使用jacoco收集单元测试的覆盖率

    之前系统的持续集成覆盖率工具使用的是cobetura,使用的过程中虽然没什么问题,但感觉配置比较麻烦,现在准备改用jacoco这个覆盖率工具来代替它.接下来我介绍一下jenkins配置jacoco,并 ...