zoukankan      html  css  js  c++  java
  • 设计模式之代理模式

    代理模式:

    在代理模式(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 : Image
    27     {
    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         }
  • 相关阅读:
    视图中访问 路由参数
    视图中的Layout使用(转)
    js判断浏览器类型以及版本
    再关于IE11
    关于IE11
    js获取当前页面的网址域名地址
    contenteditable 属性
    HTMl5的sessionStorage和localStorage(转)
    c 数组做为形參时 该參数退化为指针
    汉诺塔-递归实现
  • 原文地址:https://www.cnblogs.com/mohanchen/p/9588073.html
Copyright © 2011-2022 走看看