设计模式完结(12)-- 代理模式
代理模式与装饰模式区别:
装饰器模式关注于在一个对象上动态的添加方法,然而代理模式关注于控制对对象的访问。换句话说,用代理模式,代理类(proxy class)可以对它的客户隐藏一个对象的具体信息。
因此,当使用代理模式的时候,我们常常在一个代理类中创建一个对象的实例。并且,当我们使用装饰器模 式的时候,我们通常的做法是将原始对象作为一个参数传给装饰者的构造器。
我们可以用另外一句话来总结这些差别:使用代理模式,代理和真实对象之间的的关系通常在编译时就已经确定了,而装饰者能够在运行时递归地被构造。
//代理模式 public class Proxy implements Subject{private Subject subject;public Proxy(){//关系在编译时确定subject = new RealSubject();}public void doAction(){….subject.doAction();….} } //代理的客户 public class Client{public static void main(String[] args){//客户不知道代理委托了另一个对象Subject subject = new Proxy();…} }
代理模式:
是一种对象结构型模式。在代理模式中引入了一个新的代理对象,代理对象在客户端对象和目标对象之间起到中介的作用,它去掉客户不能看到的内容和服务或者增添客户需要的额外的新服务。
实例:
//AccessValidator.cs using System; namespace ProxySample { class AccessValidator { //模拟实现登录验证 public bool Validate(string userId) { Console.WriteLine("在数据库中验证用户'" + userId + "'是否是合法用户?"); if (userId.Equals("杨过")) { Console.WriteLine("'{0}'登录成功!",userId); return true; } else { Console.WriteLine("'{0}'登录失败!", userId); return false; } } } } //Logger.cs using System; namespace ProxySample { class Logger { //模拟实现日志记录 public void Log(string userId) { Console.WriteLine("更新数据库,用户'{0}'查询次数加1!",userId); } } } //Searcher.cs namespace ProxySample { interface Searcher { string DoSearch(string userId, string keyword); } } //RealSearcher.cs using System; namespace ProxySample { class RealSearcher : Searcher { //模拟查询商务信息 public string DoSearch(string userId, string keyword) { Console.WriteLine("用户'{0}'使用关键词'{1}'查询商务信息!",userId,keyword); return "返回具体内容"; } } }
//ProxySearcher.cs namespace ProxySample { class ProxySearcher : Searcher { private RealSearcher searcher = new RealSearcher(); //维持一个对真实主题的引用 private AccessValidator validator; private Logger logger; public string DoSearch(string userId, string keyword) { //如果身份验证成功,则执行查询 if (this.Validate(userId)) { string result = searcher.DoSearch(userId, keyword); //调用真实主题对象的查询方法 this.Log(userId); //记录查询日志 return result; //返回查询结果 } else { return null; } } //创建访问验证对象并调用其Validate()方法实现身份验证 public bool Validate(string userId) { validator = new AccessValidator(); return validator.Validate(userId); } //创建日志记录对象并调用其Log()方法实现日志记录 public void Log(string userId) { logger = new Logger(); logger.Log(userId); } } }
在代理类ProxySearcher中实现对真实主题类的权限控制和引用计数.
15.7 代理模式效果与适用场景
代理模式是常用的结构型设计模式之一,它为对象的间接访问提供了一个解决方案,可以对对象的访问进行控制。代理模式类型较多,其中远程代理、虚拟代理、保护代理等在软件开发中应用非常广泛。
15.7.3 模式适用场景
代理模式的类型较多,不同类型的代理模式有不同的优缺点,它们应用于不同的场合:
(1) 当客户端对象需要访问远程主机中的对象时可以使用远程代理。
(2) 当需要用一个消耗资源较少的对象来代表一个消耗资源较多的对象,从而降低系统开销、缩短运行时间时可以使用虚拟代理,例如一个对象需要很长时间才能完成加载时。
(3) 当需要为某一个被频繁访问的操作结果提供一个临时存储空间,以供多个客户端共享访问这些结果时可以使用缓冲代理。通过使用缓冲代理,系统无须在客户端每一次访问时都重新执行操作,只需直接从临时缓冲区获取操作结果即可。
(4) 当需要控制对一个对象的访问,为不同用户提供不同级别的访问权限时可以使用保护代理。
(5) 当需要为一个对象的访问(引用)提供一些额外的操作时可以使用智能引用代理。
Java的三种代理模式
http://www.cnblogs.com/cenyu/p/6289209.html
转载于:https://www.cnblogs.com/wuer888/p/6692736.html
设计模式完结(12)-- 代理模式相关推荐
- 设计模式学习之代理模式学习(一)
设计模式学习之代理模式学习(一) 关于设计模式想必学习过Java语言的人都知道吧,当时对其进行深入学习的的人应该不是很多.在我看来设计方面的知识相比于框架应用配置等知识要有意思的多,并且设计模式的对一 ...
- 设计模式之静态代理模式实战
转载自 设计模式之静态代理模式实战 静态代理模式很简单,代理类和实现类都实现相同的接口,然后通过代理类来调用实现类的方法. 如我们想保存用户信息之前打印用户信息,或者保存用户信息之后把这些信息缓存下来 ...
- 设计模式之蝉——代理模式上中
代理模式的扩展 1 普通代理 :这种代理就是客户端只能访问代理角色,而不能访问真实角色.与设计模式之蝉--代理模式上 片基本差不多. (1)Subject抽象主题角色: (2)RealSubject具 ...
- 每日一个设计模式之【代理模式】
文章目录 每日一个设计模式之[代理模式] ☁️前言
- 大话设计模式C++版——代理模式
本篇開始前先发个福利,程杰的<大话设计模式>一书高清电子版(带文件夹)已上传至CSDN,免积分下载. 下载地址:http://download.csdn.net/detail/gu ...
- Java24种设计模式(第二种)--代理模式(Proxy Pattern)
Java24种设计模式 (第二种) 一.代理模式(Proxy Pattern) 模式逻辑: 什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢就先找我的代理人吧,那代理人总要知道 被代理人能做哪些事 ...
- 23种java设计模式详解-代理模式
什么是代理模式: Proxy模式又叫做代理模式,是构造型的设计模式之一,它可以为其他对象提供一种代理(Proxy)以控制对这个对象的访问.所谓代理,是指具有与代理元(被代理的对象)具有相同的接口的类, ...
- 设计模式:4.代理模式
代理模式 代理模式属于结构型模式 定义:为其他对象提供一种代理以控制对这个对象的访问 代理模式就是在操作原对象的时候,多出来一个代理类,用来对原对象的访问进行控制和替代原对象进行一些操作 模式类图 角 ...
- 《设计模式系列》- 代理模式
有情怀,有干货,微信搜索[三太子敖丙]关注这个有一点点东西的程序员. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的系列文 ...
- 【C++设计模式】-03代理模式
代理模式 代理模式介绍 今天继续学习设计模式,今天我们来学习代理模式.其实这个模式呢在我们的生活早已经运用起来了.笔者看到这个模式就联想到了代理商.我们客户买东西一般都是经过代理商的,代理商和真正的生 ...
最新文章
- vue 2.0 filter html,vue.filter使用方法是什么
- Linux 执行文件查找命令 which 详解
- java非静态块,在java中使用非静态块有什么用?
- 正确处理 Azure OnStop 事件
- Pair Project: Elevator Scheduler Report By Hu Renjun
- TCP往返时延的估计和超时
- mongo oplog 整理
- 前端学习(3339):ant design中加上icon图标
- ext中ArrayStore,JsonStore,XmlStore的用
- linux命令kill_什么是Linux中的kill命令?
- 这篇文章,自带背景音乐。因为它来自1993年!
- zmeet会议在金融、教育和场景特点与产品功能方案
- 上海计算机一级和四六级,上海市关于英语四六级考试的改革通知
- 【入门】QQ聊天机器人--HelloWorld篇
- JAVA中简单图形界面的创建
- 如何用LaTeX写一个PPT
- Li feifei How we're teaching computers to understand pictures
- 小程序组件-仿微信通讯录
- kafka-分区重分配及相关源码分析
- 沙盒型源码安全解决方案
热门文章
- 图的广度优先遍历和深度优先遍历
- 网页撤销后ubuntu本地撤销
- Java提高篇——静态代码块、构造代码块、构造函数以及Java类初始化顺序
- java_eclipse_maven_svn_主题彩色插件_全屏插件
- 谷歌浏览器主页_谷歌浏览器客服人工服务电话怎样查询-客服人工服务电话查询方法...
- (89)FPGA除法器设计
- (81)Verilog HDL:状态机一段式
- (72)Verilog HDL系统函数和任务:$display
- (34)System Verilog类的多对象详解
- (30)System Verilog设计SPI发送