zoukankan      html  css  js  c++  java
  • (原创)无废话C#设计模式之九:Proxy

     

    无废话C#设计模式之九:Proxy

     

    意图

     

           为其他对象提供一种代理以控制对这个对象的访问。

     

    场景

     

    代理模式非常常用,大致的思想就是通过为对象加一个代理来降低对象的使用复杂度、或是提升对象使用的友好度、或是提高对象使用的效率。在现实生活中也有很多代理的角色,比如明星的经纪人,他就是一种代理,经纪人为明星处理很多对外的事情,目的是为了节省被代理对象也就是明星的时间。保险代理人帮助投保人办理保险,目的降低投保的复杂度。

    在开发中代理模式也因为目的不同效果各不相同。比如,如果我们的网站程序是通过.NET Remoting来访问帐号服务的。在编写代码的时候可能希望直接引用帐号服务的DLL,直接实例化帐号服务的类型以方便调试。那么,我们可以引入Proxy模式,做一个帐号服务的代理,网站只需要直接调用代理即可。在代理内部实现正式和测试环境的切换,以及封装调用.NET Remoting的工作。

     

    示例代码

     

    using System;

    using System.Collections.Generic;

    using System.Text;

     

    namespace ProxyExample

    {

        class Program

        {

            static void Main(string[] args)

            {

                AccountProxy ap = new AccountProxy();

                ap.Register();

            }

        }

     

        interface IAccount

        {

            void Register();

        }

     

        class Account : IAccount

        {

            public void Register()

            {

                System.Threading.Thread.Sleep(1000);

                Console.WriteLine("Done");

            }

        }

     

        class AccountProxy : IAccount

        {

            readonly bool isDebug = true;

            IAccount account;

            public AccountProxy()

            {

                if (isDebug)

                    account = new Account();

                else

                    account = (IAccount)Activator.GetObject(typeof(IAccount), "uri");

            }

            public void Register()

            {

                Console.WriteLine("Please wait...");

                account.Register();

            }

        }

    }

    代码执行结果如下图:

     

     

    代码说明

     

    l         IAccount就是抽象主题角色。代理对象和被代理对象都遵循这个接口,这样代理对象就能替换被代理对象。

    l         AccountProxy就是代理主题角色。代理主题通常会存在一些逻辑或预处理或后处理操作,不会仅仅是对操作的转发。

    l         Account就是真实主题角色。

     

    何时采用

     

    l         代理模式应用非常广泛,如果你希望降低对象的使用复杂度、或是提升对象使用的友好度、或是提高对象使用的效率都可以考虑代理模式。

     

    实现要点

     

    l         代理对象和被代理对象都遵循一致的接口。

    l         在某些情况下,可以不必保持接口一致性,如果封装确实需要损失一些透明度,那么也可以认为是Proxy

     

    注意事项

     

    l         ProxyFacade以及Adapter可能都是对对象的一层封装,侧重点不同。Proxy基于一致的接口进行封装,Facade针对封装子系统,转化为高层接口,而Adapter的封装是处于适配接口的目的。

  • 相关阅读:
    Spring spEL
    Spring 使用外部部署文件
    Spring 自动装配
    spring 属性配置细节
    hdu 1054 Strategic Game
    fzu 2037 Maximum Value Problem
    将博客搬至CSDN
    HDU 4714 Tree2Cycle
    HDU 1009 The Shortest Path in Nya Graph
    POJ 1942 Paths on a Grid 组合数的优化
  • 原文地址:https://www.cnblogs.com/lovecherry/p/917363.html
Copyright © 2011-2022 走看看