博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
代理模式
阅读量:6289 次
发布时间:2019-06-22

本文共 2369 字,大约阅读时间需要 7 分钟。

代理模式:给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问。

首先从表面上看,最容易理解的就是代理为别人完成某件事(为他人做嫁衣)

场景

某某A要追求某某C,这个时候某某A要求某某B代理自己去追求C

图片

根据图片就知道代理跟真实的行为是一样的,不过时提供了一种访问的间接性

//被最求者 class person    {        private string name;        public string Name        {            get { return name; }            set { name = value; }        }    }    //共同需要的接口    interface GiveGift    {        void SongHua();        void SongWaWa();        void SongQiaoKeLi();    }    ///     ///追求者A    ///     class A : GiveGift    {        person p;        public A(person person)        {            this.p = person;        }        ///         /// 具体方法的实现/实际的行为        ///         public void SongHua()        {            Console.WriteLine(p.Name+="送你鲜花");        }        public void SongQiaoKeLi()        {            Console.WriteLine(p.Name+="送你巧克力");        }        public void SongWaWa()        {            Console.WriteLine(p.Name+="送你洋娃娃");        }    }    ///     /// 代理    ///     class B : GiveGift    {        A a;         public B(person person)        {            this.a = new A(person);        }        public void SongHua()        {            //在实现方法中调用追求者类的相关代码            a.SongHua();        }        public void SongQiaoKeLi()        {            a.SongQiaoKeLi();        }        public void SongWaWa()        {            a.SongWaWa();        }    }

客户端调用:调用代理就好

static void Main(string[] args)        {            person p = new person(){Name="saili" };            B b = new B(p);            b.SongHua();            b.SongQiaoKeLi();            b.SongWaWa();            Console.ReadKey();        }

说白了,代理就是真实对象的代表。

代理模式的其他应用

一:远程代理,也就是为一个对象在不同的地址空间提供局部代码,这样可以隐藏一个对象存在于不同地址空间的事实。

例如LwebService WCF引用webservice此时会在项目中生成一些的文件夹和文件,其实就是代理,可以使得客户端程序调用代理解决远程访问的问题
二:虚拟代理:是根据需要创建开销很大的对象,通过它来存放实例化需要很长的时间的真实对象,这样可以达到性能的最优化
例如:你打开一个很大的HTML的页面,里面可能有很多的文字和图片,但是你可以很快的打开他,此时你看到的是所有的文字,但图片却是一张一张的下载下来才能看,那些未打算开的图片,就是通过虚拟的代理来替代了真实的图片,此时代理存放真正的图片路径和尺寸。
三:安全代理:用来控制真实对象访问时的权限,一般用于对象有不同的权限的时候
四:智能指引,是指调用真实的对象时,代理处理另外一些事情
例如:计算真实对象的引用次数,这样当该对象没有引用的时候,可以自动释放它,或者第一次引用一个持久对象将它装入内存,或者在访问一个实际对象前,检查是否已经锁定它,以确保其他对象不能改变它。

 

才开始用的时候很像委托,特意上网查了一下

代理(Proxy)其实是一种设计模式,例如:某个不想被外界访问或者禁止直接被外界的对象,此时需要有一个中介使其能够与外界进行通讯,而种中介就称做代理。而C#中的委托(Delegate)有些不同,其本质是一种函数指针,其只是把对象委托给它的方法原封不动地提供给其他对象调用,并不能做任何的修饰。而代理并不是按照原接口提供出去,其做法是自身定义一个与被代理对象相同或者相似的接口提供给外界调用,因为提供的方法完全由代理本身的性质决定

 

转载于:https://www.cnblogs.com/liu23/p/9074492.html

你可能感兴趣的文章
迷人的卡耐基说话术
查看>>
PHP导出table为xls出现乱码解决方法
查看>>
PHP问题 —— 丢失SESSION
查看>>
Java中Object类的equals()和hashCode()方法深入解析
查看>>
数据库
查看>>
Vue------第二天(计算属性、侦听器、绑定Class、绑定Style)
查看>>
dojo.mixin(混合进)、dojo.extend、dojo.declare
查看>>
Python 数据类型
查看>>
iOS--环信集成并修改头像和昵称(需要自己的服务器)
查看>>
PHP版微信权限验证配置,音频文件下载,FFmpeg转码,上传OSS和删除转存服务器本地文件...
查看>>
教程前言 - 回归宣言
查看>>
PHP 7.1是否支持操作符重载?
查看>>
Vue.js 中v-for和v-if一起使用,来判断select中的option为选中项
查看>>
Java中AES加密解密以及签名校验
查看>>
定义内部类 继承 AsyncTask 来实现异步网络请求
查看>>
VC中怎么读取.txt文件
查看>>
如何清理mac系统垃圾
查看>>
企业中最佳虚拟机软件应用程序—Parallels Deskto
查看>>
Nginx配置文件详细说明
查看>>
怎么用Navicat Premium图标编辑器创建表
查看>>