• 设计模式——代理模式(Proxy Pattern)


    1. 作用

    代理模式支持某些对象控制其他对象的创建和访问。代理一般是由简单对象代替复杂对象,并且这些复杂对象会随着环境的确定而被激活。

    2. 设计

    UML图:

      

    说明:

      1. Proxy 包含 Subject 对象。

      2. Proxy 实现 ISubject 接口。

      3. Client 包含 ISubject 接口定义的对象。

    分类:

      1. 虚拟代理:通过另一个对象来创建对象。

      2. 认证代理:检查请求是否具有访问权限。

      3. 远程代理:编码请求,并通过网络发送该请求。

      4. 智能代理:在发送请求前,增加或者改变请求。

    3. 实现

    实现代码:

     1 using System;
     2 
     3 namespace DesignPatternConsoleDemo.ProxyPattern
     4 {
     5     public interface ISubject
     6     {
     7         string Request();
     8     }
     9 
    10     public class Subject
    11     {
    12         public string Request()
    13         {
    14             return "Subject Reques Choose left door
    ";
    15         }
    16     }
    17 
    18     public class Proxy : ISubject
    19     {
    20         Subject subject;
    21         public string Request()
    22         {
    23             if (subject == null)
    24             {
    25                 Console.WriteLine("Subject Inactive");
    26                 subject = new Subject();
    27             }
    28             Console.WriteLine("Subject Active");
    29             return "Proxy: Call to " + subject.Request();
    30         }
    31     }
    32 
    33     public class ProtectionProxy : ISubject
    34     {
    35         Subject subject;
    36         string password = "123456";
    37         public string Authenticate(string supplied)
    38         {
    39             if (supplied != password)
    40                 return "Protection Proxy: No Access";
    41             else
    42             {
    43                 subject = new Subject();
    44                 return "Protection Proxy: Authenticated";
    45             }
    46         }
    47         public string Request()
    48         {
    49             if (subject == null)
    50             {
    51                 return "Protection Proxy: Authenticate First";
    52             }
    53             else
    54             {
    55                 return "Protection Proxy: Call to " + subject.Request();
    56             }
    57         }
    58     }
    59     public class Client
    60     {
    61         public static void Demo()
    62         {
    63             Console.WriteLine("Proxy Pattern 
    ");
    64             ISubject subject = new Proxy();
    65             Console.WriteLine(subject.Request());
    66             Console.WriteLine(subject.Request());
    67 
    68             subject = new ProtectionProxy();
    69             Console.WriteLine(subject.Request());
    70             Console.WriteLine((subject as ProtectionProxy).Authenticate("123321"));
    71             Console.WriteLine((subject as ProtectionProxy).Authenticate("123456"));
    72             Console.WriteLine(subject.Request());
    73         }
    74     }
    75 }

    调用:

     1 namespace DesignPatternConsoleDemo
     2 {
     3     class Program
     4     {
     5         static void Main(string[] args)
     6         {
     7             DesignPatternConsoleDemo.ProxyPattern.Client.Demo();
     8         }
     9     }
    10 }

    结果:

    Proxy Pattern
    
    Subject Inactive
    Subject Active
    Proxy: Call to Subject Reques Choose left door
    
    Subject Active
    Proxy: Call to Subject Reques Choose left door
    
    Protection Proxy: Authenticate First
    Protection Proxy: No Access
    Protection Proxy: Authenticated
    Protection Proxy: Call to Subject Reques Choose left door

    4. 应用场景

    代理模式在图像显示系统中比较常见,代理在屏幕是放置一个容器,之后激活一个真正的画图对象来获取和解析显示图像。同理,代理模式可以用于初始化视频流的缓冲。

    代理和装饰一样,前台接受请求,然后转交另一对象进行处理。不同的是,代理关系是在设计时就确定的和明确的。而装饰是动态添加。

    适用性:

      现有:

        1. 创建成本很高

        2. 需要权限控制

        3. 访问远程站点

        4. 无论是否有权限,都需要有反馈

      目标:

        1. 根据请求的操作来创建对象

        2. 无论是否有权限,都需要有反馈

        3. 本地对可以引用远程对象

        4. 根据请求实现对象的访问权限

  • 相关阅读:
    define的用法
    MySQL索引使用方法和性能优化
    自己写的一个Js小插件
    .net处理JSON简明教程
    史上最全的ASP.NET MVC路由配置,以后RouteConfig再弄不懂神仙都难救你啦~
    Python面向对象之-反射
    Python内置函数之classmetho staticmethod
    Python内置函数之-property
    python面向对象三大特性-多态
    python面向对象三大特性之封装
  • 原文地址:https://www.cnblogs.com/zhuhc/p/3460579.html
Copyright © 2020-2023  润新知