设计模式 四人帮

代理是另一种结构设计模式 ,可以“代表”另一个对象或“代替”另一个对象以访问后面的对象。

何时使用此模式?

当我们需要创建一个包装来覆盖客户端的主要对象的复杂性时,将使用代理模式。

有哪些使用场景?

  • 虚拟代理–设想一种情况,其中有多个数据库调用来提取大尺寸图像。 由于这是一项昂贵的操作,因此我们可以使用代理模式,该模式将创建多个代理并指向庞大的内存消耗对象以进行进一步处理。 仅当客户端首先请求/访问该对象时,才创建真实对象,然后,我们可以仅引用代理来重用该对象。 这避免了对象的重复,从而节省了内存。
  • 远程代理–可以将远程代理视为RPC调用中的存根。 远程代理提供了存在于不同地址位置中的对象的本地表示。 另一个示例可以是为远程资源(例如Web服务或REST资源)提供接口。
  • 保护性代理–保护性代理充当授权层,以验证实际用户是否有权访问适当的内容。 可以考虑一个有关在办公室中提供限制性Internet访问的代理服务器的示例。 仅允许使用有效的网站和内容,其余的将被阻止。
  • 智能代理–智能代理通过在访问对象时插入特定操作来提供附加的安全层。 一个示例可以是在访问真实对象之前检查它是否已锁定,以确保没有其他对象可以更改它。

结构体:

代理设计模式结构

参加者:

  • 主题–此对象定义RealSubject和Proxy的通用接口,以便可以在需要RealSubject的任何地方使用Proxy。
  • 代理–维护对RealSubject的引用,以便代理可以访问它。 它还实现了与RealSubject相同的接口,因此可以使用Proxy代替RealSubject。 代理还控制对RealSubject的访问,并且可以创建或删除此对象。
  • RealSubject –引用代理代表的主要对象。

例:

我们将在本文中讨论两个示例。 第一个是虚拟代理模式,另一个是保护代理模式。

虚拟代理示例

如前所述,虚拟代理对于节省昂贵的内存资源很有用。 让我们以实际图像包含客户端需要访问的巨大数据为例。 为了节省我们的资源和内存,实现如下:

  • 创建一个供客户端访问的接口。 其所有方法将由ProxyImage类和RealImage类实现。
  • RealImage在不同的系统上运行,并且包含可从数据库访问的图像信息。
  • 在其他系统上运行的ProxyImage可以在新系统中表示RealImage。 使用代理,我们可以避免多次加载图像。

类图:

虚拟代理示例

代码示例:

图像.java

public interface Image {public void showImage();
}

RealImage.java

public class RealImage implements Image {private String fileName = null; public RealImage(String strFileName){this.fileName = strFileName;}@Overridepublic void showImage() {System.out.println('Show Image:' +fileName);}
}

ProxyImage.java

public class ProxyImage implements Image {private RealImage img= null;private String fileName = null;public ProxyImage(String strFileName) {this.fileName = strFileName;}/** (non-Javadoc)* @see com.proxy.virtualproxy.Image#showImage()*/@Overridepublic void showImage() {if(img == null){img = new RealImage(fileName);}img.showImage();}
}

客户端程序

public class Client {
public static void main(String[] args) {final Image img1 = new ProxyImage('Image***1');final Image img2 = new ProxyImage('Image***2');img1.showImage();img2.showImage();}
}

保护代理示例:

  • 假设ABC公司启动了一项新政策,即根据其角色现在禁止员工访问Internet。 所有外部电子邮件网站将被阻止。 在这种情况下,我们创建InternetAccess接口,该接口由操作GrantInternetAccess()组成。
  • RealInternetAccess类,允许所有人访问互联网。 但是,为了限制此访问,我们将使用ProxyInternetAccess类,该类将检查用户的角色并根据其角色授予访问权限。

类图:

保护代理示例

代码示例:

互联网:

public interface InternetAccess {public void grantInternetAccess();
}

RealInternetAccess.java

public class RealInternetAccess implements InternetAccess {private String employeeName = null;public RealInternetAccess(String empName) {this.employeeName = empName;}@Overridepublic void grantInternetAccess() {System.out.println('Internet Access granted for employee: '+ employeeName);}
}

ProxyInternetAccess.java

public class RealInternetAccess implements InternetAccess {private String employeeName = null;public RealInternetAccess(String empName) {this.employeeName = empName;}@Overridepublic void grantInternetAccess() {System.out.println('Internet Access granted for employee: '+ employeeName);}
}

客户端程序

public static void main(String[] args) {InternetAccess ia = new ProxyInternetAccess('Idiotechie');ia.grantInternetAccess();}

优点:

  • 如上例所示,代理模式的优点之一就是安全性。
  • 这种模式避免了对象的复制,这些对象可能是巨大的并且占用大量内存。 反过来,这可以提高应用程序的性能。
  • 远程代理还通过在客户端计算机上安装本地代码代理(存根),然后借助远程代码访问服务器来确保安全性。

缺点/后果:

这种模式引入了另一层抽象,如果某些客户端直接访问RealSubject代码,而其中一些可能访问Proxy类,则有时可能会遇到问题。 这可能会导致不同的行为。

有趣的一点:

  • 相关模式之间几乎没有差异。 像适配器模式为主题提供了不同的接口,而代理模式提供了与原始对象相同的接口,而装饰器提供了增强的接口。 装饰器模式在运行时添加了其他行为。
  • Java API中使用的代理:java.rmi。*;

请不要忘记发表您的评论。 如果您喜欢本文,请通过社交网络链接为您的朋友分享此文章。

下载示例代码:

参考: Idiotechie博客上来自JCG合作伙伴 Mainak Goswami 的“四人帮–代理设计模式” 。

翻译自: https://www.javacodegeeks.com/2012/11/gang-of-four-proxy-design-pattern.html

设计模式 四人帮

设计模式 四人帮_四人帮–代理设计模式相关推荐

  1. Java设计模式(五)代理设计模式—静态代理—JDK动态代理—Cglib动态代理

    文章目录 什么是代理模式 代理模式应用场景 代理的分类 静态代理 什么是静态代理 深入解析静态代理 小结 动态代理 什么是动态代理 JDK动态代理 原理和实现方式 代码实现 优缺点 Cglib动态代理 ...

  2. 设计模式(三)代理设计模式

    文章目录 1.定义 2.使用场景: 3.代理模式分类 3.1 静态代理模式 4.1 动态代理模式 更多设计模式文章请阅读: 设计模式专栏 1.定义 为其他对象提供一种代理以控制对这个对象的直接控制 2 ...

  3. 设计模式之_动态代理_01

    package com.learn.proxy;import java.util.Random;/*** 产生了坦克这么一个类* 坦克当然是可以移动的,实现了接口,实现了move方法* 我想知道一个方 ...

  4. 设计模式之_动态代理_06

    package com.learn.proxy;public class Client {public static void main(String[] args) throws Exception ...

  5. 设计模式之_动态代理_05

    package com.learn.proxy;public class Client {public static void main(String[] args) {Tank t = new Ta ...

  6. 设计模式之_动态代理_02

    package com.learn.proxy;/*** JDK的那个类就叫Proxy* @author Leon.Sun**/ public class Proxy {/*** 这个方法就是用来产生 ...

  7. 设计模式之_动态代理_03

    我们假设被代理的对象实现了一个接口,不管它实现了什么样的接口,但是它实现了一个接口,用集成也可以实现代理,但是继承不好,所以我们被代理的类要实现一个接口,这个在Spring也是这么要求的,不过Spri ...

  8. java设计模式 观察者模式_理解java设计模式之观察者模式

    在生活实际中,我们经常会遇到关注一个事物数据变化的情况,例如生活中的温度记录仪,当温度变化时,我们观察它温度变化的曲线,温度记录日志等.对于这一类问题,很接近java设计模式里面的"观察者模 ...

  9. 设计模式示例_责任链设计模式示例

    设计模式示例 本文是我们名为" Java设计模式 "的学院课程的一部分. 在本课程中,您将深入研究大量的设计模式,并了解如何在Java中实现和利用它们. 您将了解模式如此重要的原因 ...

最新文章

  1. Android Touch事件传递机制解析 (推荐)
  2. python任务调度框架_Python任务调度模块APScheduler
  3. 【Linux】一步一步学Linux——make命令(259)
  4. 微信开发必看,使用.Net Core 开发微信跨平台应用
  5. 【渝粤题库】陕西师范大学202421 教育管理心理学 作业 (专升本)
  6. Elasticsearch7.15.2 分布式集群安装(linux环境)
  7. 离散数学之集合论 【下】
  8. PHP大型Web应用入门(一)
  9. 百度被告监听用户,回应“没那能力”,但小米说锅就是你的!
  10. 多目标进化优化_科研一角|论文分享 | 等离子喷焊工艺参数多目标优化
  11. 网络岗7 97用户破解图片
  12. 黑龙江省谷歌高清卫星地图下载
  13. N33-Week 1-向日葵
  14. 紫猫插件-网络共享数据(7-15)
  15. Excel VBA批注
  16. [BZOJ4556]-[Tjoi2016Heoi2016]字符串-后缀自动姬+线段树合并+倍增
  17. linux 域名判断 跳转,Nginx判断不同的域名指向不同的root路径实例
  18. no javac in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)
  19. ajax提交文件对象----form组件+form表单+FormData对象
  20. 金属质感怎么把握?高光和反光对比一定要加强~

热门文章

  1. 在比特币世界中矿工的作用是什么
  2. 装饰器模式和代理模式的区别
  3. java中如何数组是如何赋值的?
  4. HTML5表格简单应用案例之[招聘需求表]
  5. mybatis简单案例源码详细【注释全面】——实体层(Role.java)
  6. 购物车的功能——JS源码
  7. JS中闭包的应用自定义JS模块
  8. 多行单列CV小技能----Alt加鼠标滚轮
  9. keyshot卡住了还能保存吗_相机希望你知道的13件事 keyshot相机切换事件
  10. 基础笔试编程题(jz)