zoukankan      html  css  js  c++  java
  • C#设计模式系列:代理模式(Proxy Pattren)

    一、引言

      在软件开发过程中,有些对象有时候会由于网络或者其他的障碍,以至于不能够或者不能直接访问到这些对象,如果直接访问对象给系统带来不必要的复杂性,这时候可以在客户端和目标对象之间增加一层中间层,让代理对象代替目标对象,然后客户端只需要访问代理对象,由代理对象去帮我们去请求目标对象并返回结果给客户端,这样的一个解决思路就是今天要介绍的  代理模式(Proxy Pattern)

    二、代理模式的详细介绍

    代理模式按照使用目的可以分为以下几种:

    • 远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代表对象,这个不同的地址空间可以是本电脑中,也可以在另一台电脑中,比如——客户端调用Web服务或者WCF服务。
    • 虚拟(Virtual)代理:根据需要创建一个资源耗大的对象,使得对象只在需要时才会被真正创建。
    • 要时,才真正采取行动。
    • 保护(Protect or Access)代理:控制一个对象的访问,可以给不同的用户提供不同级别的使用权限。
    • 防火墙(Firewall)代理:保护目标不让恶意用户接近。
    • 智能引用(Smart Reference)代理:当一个对象被引用时,提供一些额外的操作,比如将对此对象调用的次数记录下来等。
    • Cache代理:为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以这些结果。

    2.1 定义

      代理模式——就是给某一个对象提供一个代理,并由代理对象控制对原对象的引用,在一些情况下,一个客户不想或者不能直接引用一个对象,而代理对象可以在客户端与目标对象之间起到中介作用。

    2.2代理模式的结构图

    代理模式

    2.3模式的组成

    • 抽象主题角色(Subject):声明了真实主题和代理的公共接口,这样一来在使用真实主题的任何地方都可以使用代理主题
    • 代理主题角色(Proxy):代理主题角色内部包含有对真实主题的引用,从而可以操作真实对象,代理角色负责在需要的时候创建真实对象,
    • 真实主题角色(RealSubject):定义了代理角色所代表的真实对象。

    例如:在WCF或者WebService的开发过程中,我们在客户端添加服务引用的时候,在客户程序中会添加一些额外的类,在客户端生成的类扮演着代理主题角色,我们客户端也是直接调用这些代理角色来访问远程服务提供的操作。这个是远程代理的一个典型例子。

    2.4代理模式的代码

    Subject类,定义了RealSubject和Proxy的公用接口,这样就在任何使用RealSubject的地方都可以使用Proxy

      public abstract   class Subject
        {
            public abstract void Request();
        }
    View Code

    RealSubject类,定义了Proxy所有代表的真实对象

      public   class RealSubject:Subject
        {
            public override void Request()
            {
                Console.WriteLine("真实的对象");
            }
        }
    View Code

    Proxy类,保持一个引用使得代理可以访问实体,并提供一个与subject的接口相同的接口,这样代理就可以用来替代实体

        public class Proxy:Subject
        {
            protected RealSubject realsubject;
            public override void Request()
            {
                if (realsubject==null)
                {
                    realsubject = new RealSubject();
                }
                realsubject.Request();
            }
        }
    View Code

    客户端调用

       class Program
        {
            static void Main(string[] args)
            {
                Proxy proxy = new Proxy();
                proxy.Request();
                Console.Read();
            }
        }
    View Code
    三、代理模式的优缺点

    全面分析完代理模式之后,让我们看看这个模式的优缺点:

    优点:

    1. 代理模式能够将调用用于真正被调用的对象隔离,在一定程度上降低了系统的耦合度;
    2. 代理对象在客户端和目标对象之间起到一个中介的作用,这样可以起到对目标对象的保护。代理对象可以在对目标对象发出请求之前进行一个额外的操作,例如权限检查等。

    缺点:

    1. 由于在客户端和真实主题之间增加了一个代理对象,所以会造成请求的处理速度变慢
    2. 实现代理类也需要额外的工作,从而增加了系统的实现复杂度。
  • 相关阅读:
    Do You See Me? Ethical Considerations of the Homeless
    ELDER HOMELESSNESS WHY IS THIS AN ISSUE?
    Endoflife support is lacking for homeless people
    html内联框架
    html字体
    html块 div span
    html列表
    html表格
    SQL Server管理员专用连接的使用   作为一名DBA,经常会处理一些比较棘手的服务无响应问题,鉴于事态的严重性,多数DBA可能直接用“重启”大法,以便尽快的恢复生产环境的正常运转,但是多数情况
    如何配置最大工作线程数 (SQL Server Management Studio)
  • 原文地址:https://www.cnblogs.com/studydp/p/9545214.html
Copyright © 2011-2022 走看看