结构设计模式 - 代理设计模式

代理设计模式是结构设计模式之一,在我看来是最简单的模式之一。

目录[ 隐藏 ]

  • 1代理设计模式

    • 1.1代理设计模式 - 主类
    • 1.2代理设计模式 - 代理类
    • 1.3代理设计模式客户端程序

代理设计模式

根据GoF的代理设计模式意图是:

为另一个对象提供代理或占位符以控制对它的访问。

定义本身非常清晰,当我们想要提供功能的受控访问时,使用代理设计模式。

假设我们有一个可以在系统上运行某个命令的类。现在,如果我们使用它,它很好,但如果我们想将此程序提供给客户端应用程序,它可能有严重的问题,因为客户端程序可以发出命令删除一些系统文件或更改一些您不想要的设置。

这里可以创建代理类以提供程序的受控访问。

代理设计模式 - 主类

由于我们根据接口编写Java,这里是我们的接口及其实现类。

CommandExecutor.java


package com.journaldev.design.proxy;public interface CommandExecutor {public void runCommand(String cmd) throws Exception;
}

CommandExecutorImpl.java


package com.journaldev.design.proxy;import java.io.IOException;public class CommandExecutorImpl implements CommandExecutor {@Overridepublic void runCommand(String cmd) throws IOException {//some heavy implementationRuntime.getRuntime().exec(cmd);System.out.println("'" + cmd + "' command executed.");}}

代理设计模式 - 代理类

现在我们只想提供管理员用户对上述类的完全访问权限,如果用户不是管理员,则只允许有限的命令。这是我们非常简单的代理类实现。

CommandExecutorProxy.java


package com.journaldev.design.proxy;public class CommandExecutorProxy implements CommandExecutor {private boolean isAdmin;private CommandExecutor executor;public CommandExecutorProxy(String user, String pwd){if("Pankaj".equals(user) && "J@urnalD$v".equals(pwd)) isAdmin=true;executor = new CommandExecutorImpl();}@Overridepublic void runCommand(String cmd) throws Exception {if(isAdmin){executor.runCommand(cmd);}else{if(cmd.trim().startsWith("rm")){throw new Exception("rm command is not allowed for non-admin users.");}else{executor.runCommand(cmd);}}}}

代理设计模式客户端程序

ProxyPatternTest.java

package com.journaldev.design.test;import com.journaldev.design.proxy.CommandExecutor;
import com.journaldev.design.proxy.CommandExecutorProxy;public class ProxyPatternTest {public static void main(String[] args){CommandExecutor executor = new CommandExecutorProxy("Pankaj", "wrong_pwd");try { executor.runCommand("ls -ltr"); executor.runCommand(" rm -rf abc.pdf");} catch (Exception e) {System.out.println("Exception Message::"+e.getMessage());}}
}

上述代理设计模式示例程序的输出是:

'ls -ltr' command executed.

Exception Message::rm command is not allowed for non-admin users.

代理设计模式的常见用途是控制访问或提供包装器实现以获得更好的性能。

Java RMI包使用代理模式。

这就是java中代理设计模式的全部内容。

转载来源:https://www.journaldev.com/1572/proxy-design-pattern

结构设计模式 - 代理设计模式相关推荐

  1. 03.设计模式------代理设计模式

    代理就是被代理者没有能力或者不愿意去完成某件事情,需要找个人代替自己去完成这件事,这才是"代理"存在的原因.例如,我现在需要出国,但是我不愿意自己 去办签证.预定机票和酒店(觉得麻 ...

  2. SpringAOP之代理设计模式

    [1]设计模式: 概念: 设计模式其实就是代码的一种结构的设计思路. 好处: 增加代码健壮性 易修改性 可扩展性 设计模式的种类: 三大种类: 建造类设计模式 结构类设计模式 行为类设计模式 参考网址 ...

  3. Java设计模式(代理模式-模板方法模式-命令模式)

    Java设计模式Ⅴ 1.代理模式 1.1 代理模式概述 1.2 静态代理 1.2.1 静态代理概述 1.2.2 代码理解 1.3 动态代理之JDK代理 1.3.1 动态代理之JDK代理概述 1.3.2 ...

  4. java之 代理设计模式

    1. 设计一个案例来实现租房功能.分析:在租房的过程中涉及到了3个对象,房东,中介,房客. 中介和房客具有相同的功能--租房. 可以设计如下: 2.上图的设计实际上就是一个代理设计模式---静态代理设 ...

  5. java设计模式代理模式_Java中的代理设计模式

    java设计模式代理模式 代理对象或代理对象为另一个对象提供占位符,以控制对该对象的访问. 代理充当原始对象的轻量级版本或简化版本. 它支持与原始对象相同的操作,但可以将那些请求委托给原始对象以实现它 ...

  6. Java中的代理设计模式

    代理对象或代理对象为另一个对象提供占位符,以控制对该对象的访问. 代理充当原始对象的轻量级版本或简化版本. 它支持与原始对象相同的操作,但可以将那些请求委托给原始对象以实现它们. 代理设计模式是一种结 ...

  7. 设计模式 四人帮_四人帮–代理设计模式

    设计模式 四人帮 代理是另一种结构设计模式 ,可以"代表"另一个对象或"代替"另一个对象以访问后面的对象. 何时使用此模式? 当我们需要创建一个包装来覆盖客户端 ...

  8. 四人帮–代理设计模式

    代理是另一种结构设计模式 ,可以"代表"另一个对象或"代替"另一个对象以访问后面的对象. 何时使用此模式? 当我们需要创建一个包装来覆盖客户端的主要对象的复杂性 ...

  9. Python设计模式-代理模式

    Python设计模式-代理模式 基于Python3.5.2,代码如下 #coding:utf-8info_struct = dict() info_struct["addr"] = ...

最新文章

  1. python调用脚本或shell的方式
  2. java 6位日期 0001,当日期范围更改为从01-01-0001开始时,DimDate将不会加载
  3. RadioButton加入DataGrid模板列引起的问题。
  4. java foreach标签,jstl c:foreach标签
  5. Kafka:那我走?这个新一代消息中间件,彻底火了!
  6. 查看vnc端口_如何在 Centos 8 / RHEL 8 上安装和配置 VNC 服务器
  7. python比较文件的修改时间,如何比较python中两个文件的修改日期?
  8. js 关系图插件_babel插件的相关知识
  9. C#.NET 通用权限管理系统中的数据集权限设置实现参考界面(商业化成熟权限管理系统,提供全部源码)...
  10. 云栖科技评论世界杯特刊:俄罗斯世界杯,新技术再一次升级内容产业
  11. 【渝粤教育】国家开放大学2019年春季 455物流实务 参考试题
  12. EventBus 加强学习深入了解
  13. 【原创】开车分四个阶段的话,你属于哪个
  14. 如何找到网站服务器的源代码_企业网站如何选择服务器?
  15. DRM-X 4.0加密保护与Widevine DRM平台的区别
  16. centos7 配置阿里yum源
  17. Android Audio - HAL 层多声卡同时录音框架设计(多语言)
  18. 复数,实数,幂函数,指数函数
  19. Android中的指纹识别
  20. 【php】PHP单例模式

热门文章

  1. Magento教程 16:Magento价格规则的优先度
  2. 130个你需要了解的VIM命令
  3. PNG图在IE6下透明的终极解决方案
  4. 128.最长连续序列
  5. 人工智障学习笔记——强化学习(5)DRL与DQN
  6. Redis操作命令(一)
  7. 【词云】wordcloud安装与使用
  8. 成员变量与局部变量 java 1613807617
  9. 名词解释 JDK JRE JVM
  10. linux-vim-进入编辑模式的多种方法