设计模式学习笔记-代理模式

1. 概述

  为其它对象提供一种代理以控制对这个对象的访问。

  解决的问题:如果直接访问对象比较困难,或直接访问会给使用者或系统带来一系列问题。这样对于客户端(调用者)来说,就不需要直接与真实对象进行交互,解除了调用者与真实对象的耦合。

2. 模式中的角色

  2.1 抽象实体(Subject):定义了真实实体(RealSubject)和代理(Proxy)的公共接口,这样就在任何时候使用真实实体(RealSubject)的地方使用代理(Proxy)。

  2.2 代理(Proxy):保存一个引用使得代理可以直接访问真实实体,并提供一个与Subject的接口相同的接口,这样代理就可以代替真实实体。

  2.3 真实实体(RealSubject):定义Proxy所代表的真实实体。

3. 模式解读

  3.1 代理模式的类图

  

  3.2 代理模式的代码实现

    3.2.1 抽象实体,定义真实实体与代理的公共接口

    /// <summary>/// 抽象实体,定义真实实体与代理的公共接口/// </summary>public interface ISubject{void Function1();void Function2();}

    3.2.2 真实实体,真正的功能实现者

    /// <summary>/// 真实实体,真正的功能实现者/// </summary>public class RealSubject:ISubject{public void Function1(){Console.WriteLine("This is the first function.");}public void Function2(){Console.WriteLine("This is the second function.");}}

    3.2.3 代理,用来控制和访问真实实体

    /// <summary>/// 代理,用来访问真实的实体/// </summary>public class Proxy : ISubject{/// <summary>/// 保存一个真实实体,用以在代理中访问真实实体的功能。/// </summary>private RealSubject realSubject;public Proxy(){realSubject = new RealSubject();}/// <summary>/// 实现与Subject相同的接口,实际调用的是RealSubject的Function1()/// </summary>public void Function1(){realSubject.Function1();}/// <summary>/// 实现与Subject相同的接口,实际调用的是RealSubject的Function2()/// </summary>public void Function2(){realSubject.Function2();}}

    3.2.4 客户端的调用

    class Program{static void Main(string[] args){// 实例化代理ISubject subjectProxy = new Proxy();// 通过代理调用具体功能
            subjectProxy.Function1();subjectProxy.Function2();Console.Read();}}

    3.2.5 运行结果

    

4. 模式总结

  4.1 优点

    4.1.1 对客户端来说,隐藏了真实对象的细节及复杂性。

    4.1.2 实现了客户端(调用者)与真实对象的松耦合。

    4.1.3 远程代理使得客户端可以访问在远程机器上的对象,远程机器可能具有更好的性能与处理速度,可以快速响应并处理客户端请求。

    4.1.4 虚拟代理通过使用一个小对象来代表一个大对象,可以减少系统资源的消耗,对系统进行优化并提高运行速度。

    4.1.5 安全代理可以控制对真实对象的使用权限。

  4.2 缺点

    4.2.1 实现代理需要而为增加一个访问控制层,增加了额外工作。有的代理实现起来非常复杂。

  4.3 适用场景

    4.3.1 远程代理: 为一个位于不同地址空间的的对象提供一个本地的代理。

    4.3.2 虚拟代理:如果需要创建一个消耗较大的对象,先创建一个消耗较小的对象来表示,真实对象只在需要时才被真实创建。

    4.3.3 安全代理:用来控制对真实对象的访问权限

    4.3.4 智能指引:当调用真实对象时,代理提供一些额外的操作。如将对象被操作的次数记录起来等。

    4.3.5 缓冲代理:为某一个目标操作提供临时的存储空间,以便更多客户端共享此结果。

    4.3.6 防火墙代理:保护目标不让恶意用户接近。

    4.3.7 同步化代理:使几个用户能同时使用一个对象而没有冲突。

5. 应用举例

  5.1 远程代理;.NET的WCF的远程代理

  5.2 虚拟代理;HTML图片加载

转载于:https://www.cnblogs.com/wangjq/archive/2012/07/04/2575921.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/361797.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Tomcat配置自签名https

从JDK中找到keytool.exe&#xff0c;随便复制到一个方便的目录&#xff0c;在命令行中进入这个目录。 第一步&#xff1a;为服务器生成证书 tomcat.keystore&#xff0c;名字就是域名&#xff0c;其他的看着写。 keytool -genkey -v -alias tomcat -keyalg RSA -validity 3650…

MFC学习之路之多媒体 --(1) DirectShow

可以说整个Windows的多媒体编程都是以DirectShow为基础&#xff0c;那好&#xff0c;来吧&#xff0c;我们直接看DirectShow的一段基础代码。 bool Mp3::Load(LPCWSTR szFile) {Cleanup();ready false;if (SUCCEEDED(CoCreateInstance( CLSID_FilterGraph,NULL,CLSCTX_INPROC_…

使用反射处理Java批注

在上一篇有关Java注释的文章中&#xff0c;我概述了一个最近的用例&#xff0c;并为您提供了一些自定义注释的示例以及如何使用它们。 在本文中&#xff0c;我将更进一步&#xff0c;并为您提供一些自定义注释的示例&#xff0c;以及如何使用Java Reflection API处理这些自定义…

Excel 2007 Open XML文件结构(2)

Excel 2007 Open XML文件结构&#xff08;2&#xff09; 在以上文件中&#xff0c;根据<sheet>元素中r:id属性的值可得到工作表数据的XML文件。例如&#xff0c;在workbook.xml文件中名为工作表1的工作表的r:id属性为rld1&#xff0c;在以上文件中根据ID找到以下代码&…

Vue.js最佳实践

Vue.js最佳实践 第一招&#xff1a;化繁为简的Watchers 场景还原&#xff1a; created(){this.fetchPostList() },watch: {searchInputValue(){this.fetchPostList()} } 组件创建的时候我们获取一次列表&#xff0c;同时监听input框&#xff0c;每当发生变化的时候重新获取一…

Api demo源码学习(8)--App/Activity/QuickContactsDemo --获取系统联系人信息

本节通过Content Provider机制获取系统中的联系人信息&#xff0c;注意这个Anctivity直接继承的是ListActivity&#xff0c;所以不再需要setContentView函数来加载布局文件了&#xff08;我自己新建一个项目来跑这个anctivity时在这里卡了半天&#xff09;。 在AndroidManifest…

游戏大厅 从基础开始(6)--绕回来细说聊天室(中)之女仆编年史1

上一篇我们大致的了解了几种聊天室的行为模式 最简单明了的推模式 几乎不需要任何多余的语言来描述它的实现 这一篇我们看看如何实现拉模式更有效。 本图清晰的表现了"拉"模式聊天室的行为。 并发多用户向数据池写数据 并发多用户从数据池读书据 数据最好以时间为…

开发自上而下的Web服务项目

这是从Alessio Soldano编辑的Advanced JAX-WS Web Services手册中摘录的示例章节。 第一章介绍了自底向上创建Web服务端点的方法。 它允许非常快地将现有bean作为Web Service端点公开&#xff1a;在大多数情况下&#xff0c;将类转换为端点只需在代码中添加少量注释即可。 但…

React中ref的使用方法

React中ref的使用方法 在react典型的数据流中&#xff0c; props传递是父子组件交互的唯一方式&#xff1b;通过传递一个新的 props值来使子组件重新 re-render,从而达到父子组件通信。当然&#xff0c;就像react官网所描述的一样&#xff0c;在react典型的数据量之外&#xff…

mediawiki自动生成sitemap

Mediawiki 1.17.0提供了generateSitemap.php生成sitemap文件&#xff0c;可不必再使用扩展。 每次调用generateSitemap.php&#xff0c;生成全部sitemap。一般是通过定时任务(Linux下是cron)调用&#xff0c;定时生成。 generateSitemap.php命令示例&#xff1a; php /wiki/mai…

垃圾收集:提高吞吐量

这篇文章的灵感来自于在内存管理术语中的“ Pig in the Python ”定义。 显然&#xff0c;该术语用于解释GC反复促进大对象世代相传的情况。 据推测&#xff0c;这样做的效果类似于Python吞下整个猎物&#xff0c;只是在消化过程中被固定住了。 在接下来的24小时里&#xff0c…

Scss基础用法

Scss基础用法 一、注释用法&#xff1a; &#xff08;1&#xff09;//comment&#xff1a;该注释只是在.scss源文件中有&#xff0c;编译后的css文件中没有。 &#xff08;2&#xff09;/! /&#xff1a;重要注释&#xff0c;任何style的css文件中都会有&#xff0c;一般放置…

(Joomla)字符串截取

在用joomla进行开发的时候&#xff0c;需要用到国外的资源&#xff0c;一些module&#xff0c;组件&#xff0c;插件之类的&#xff0c;但是我们会发现&#xff0c;在字符串这个方法都需要进行修改。因为PHP的substr方法只是针对于非中文字符串有效&#xff0c;所以要使用另外一…

Pyechart:30分钟学会pyecharts数据可视化

30分钟学会pyecharts数据可视化 小红&#xff1a;你先跟我说说什么是pyecharts吧。 小明&#xff1a;Echarts 是一个由百度开源的数据可视化javascript库&#xff0c;凭借着良好的交互性&#xff0c;精巧的图表设计&#xff0c;得到了众多开发者的认可。而 Python 是一门富有表…

Spring @Configuration – RabbitMQ连接

我一直在转换必须使用Spring Configuration机制配置到RabbitMQ的连接的应用程序-最初&#xff0c;我使用xml bean定义文件来描述配置。 这是我的原始配置&#xff1a; <beans ...;><context:property-placeholder/><rabbit:connection-factory id"rabbit…

大叔手记(12):我的一次面试经历(谈大叔如何应对面试官)

本文目的 写本文的目的&#xff0c;大叔不是为了装逼&#xff08;虽然说话的口气有时候也确实有点装逼&#xff0c;性格导致的&#xff0c;咳。。。我得改&#xff09;&#xff0c;其实大叔在公司也只是小罗罗&#xff0c;本文的目的主要是为了向大家展示如何通过各种软技能应对…

欧拉回路判断规则

无向图&#xff1a;因为欧拉路径中&#xff0c;除了起点与终点以外&#xff0c;任意点的“进”“出”次数相等&#xff0c;所以除了两个点为奇点&#xff08;度数为奇数的点&#xff09;&#xff08;终点和起点&#xff09;以外&#xff0c;其它点的度数均为偶数。 如果是欧拉回…

使用Apache Camel 2.14的轻松REST端点

Apache Camel 最近发布了一个新版本 &#xff0c; 其中一些新功能由我的同事Claus Ibsen博客发布 。 您确实应该检查他的博客条目并深入研究更多细节&#xff0c;但是我希望尝试的功能之一是新的REST DSL 。 那么&#xff0c;这是什么新的DSL&#xff1f; 实际上&#xff0c;…

认识Mahout下的云计算机器学习

认识Mahout下的云计算机器学习 Apache Mahout 是 ApacheSoftware Foundation (ASF) 旗下的一个开源项目&#xff0c;提供一些可扩展的机器学习领域经典算法的实现&#xff0c;旨在帮助开发人员更加方便快捷地创建智能应用程序&#xff0c;并且&#xff0c;在 Mahout 的最近版本…

xshell常用的命令

Xshell查看所有的进程&#xff1a;ps -ef|grep tomcat查询该目录下所有的项目&#xff1a;lsXshell查看所有的zookeeper进程&#xff1a;ps -ef|grep zoo 进入到bin目录下 然后启动&#xff1a;./zkServer.sh startchmod命令大全及其解释 https://jingyan.baidu.com/article/5d…