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

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

代理模式:

在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。

在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。

介绍

意图:为其他对象提供一种代理来控制对这个对象的访问。

使用场景:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象的创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问对象会给使用者或者系统结构带很多麻烦,我们可以在访问此对象时加上一个此对象的访问层。

如何使用:增加中间层。

关键代码:实现与被代理类组合。

应用实例:

  • 远程代理,也就是为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实。
  • 虚拟代理,是根据需要创建很大开销的对象,通过它来存放实例化需要很长时间的真实对象。
  • 安全代理,用来控制真实对象访问时的权限。
  • 智能引用,是指当调用真实的对象时,代理处理另外一些事。

优点:1.职责清晰;2.高扩展性;3。智能化。

缺点:1.由于在客户端和真实对象之间增加了代理对象,因此有些类型的代理模式可能会造成请求处理速度变慢;2.实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

实例

我们将创建一个Image接口和实现了Image接口的实体类,ProxyImage是一个代理类,减少RealImage对象加载的内存占用。代码如下:

1 interface Image 2     { 3         void Display(); 4     } 5  6     class RealImage : Image 7     { 8         private String m_fileName; 9 10         public RealImage(String fileName)11         {12             m_fileName = fileName;13             LoadFormDisk(fileName);14         }15 16         public void Display()17         {18             Console.WriteLine("Displaying"+m_fileName);19         }20 21         private void LoadFormDisk(String fileName)22         {23             Console.WriteLine("Loading" + m_fileName);24         }25     }26     class ProxyImage : Image27     {28         private RealImage m_realImage;29         private String m_fileName;30 31         public ProxyImage(String fileName)32         {33             m_fileName = fileName;34         }35 36         public void Display()37         {38             if (m_realImage == null)39             {40                 m_realImage = new RealImage(m_fileName);41             }42             m_realImage.Display();43         }44     }45 46 static void Main(string[] args)47         {48             Console.WriteLine("--------代理模式---------");49             {50                 Image image = new ProxyImage("testImage.jpg");51                 image.Display();52                 Console.WriteLine();53                 image.Display();54             }55             Console.ReadLine();56         }

 

转载于:https://www.cnblogs.com/mohanchen/p/9588073.html

你可能感兴趣的文章
tuple有无list对key的影响
查看>>
java study3
查看>>
优秀的后台管理界面设计案例分享
查看>>
在VIM中使用GDB调试 – 使用vimgdb
查看>>
数据挖掘中哪些算法使用率较高?
查看>>
编程算法 - 推断二叉树是不是平衡树 代码(C)
查看>>
MySpring dataSource从配置文件获取
查看>>
矩阵的转置
查看>>
如何为SharePoint文档库、文件夹、文件单独设置权限
查看>>
【Linux】linux中很有用的指令(练习)
查看>>
C# 抽象(2)
查看>>
mysql之引擎、Explain、权限详解
查看>>
推荐-zabbix原理篇
查看>>
160809329 仲兆鹏 3
查看>>
HDOJ1013【Digital Roots】
查看>>
HDOJ1078 FatMouse and Cheese【动态规划】-----武科大ACM暑期集训队选拔赛2题
查看>>
zoj 1492(最大团)
查看>>
利用redis中列表数据类型构建共享消息队列
查看>>
解决“"连接池已满"”
查看>>
网络爬虫2:使用crawler4j爬取网络内容
查看>>