首页 > 代码库 > 设计模式 之 代理

设计模式 之 代理

代理模式(Proxy)

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


          炎炎夏日即将过去,这个夏天的西瓜,你吃爽了吗?如果要问夏天有什么可留恋的?那么肯定是那冰冰凉凉的冰西瓜!炎热的夏季里,抱着半个从冰箱里刚拿出来的冰镇西瓜,用勺子挖着吃,是很多人觉得最惬意的吃法。相信大家也都这么干过...
    今天跟大家聊的不是怎么吃西瓜,而是在哪里买西瓜。相信大家都见过路边的小摊小贩拖着一卡车西瓜便宜甩卖的场景吧;大家一般也可以在超市里买西瓜,但是这些西瓜是从哪里来的呢?小贩种的?超市种的?当然不是,大家接着往下看就明白了...


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Proxy
{
    //西瓜接口
    public interface IWatermelon
    {
        //生产西瓜的方法
         void product();
        //销售西瓜的方法
         void sell();
    }

    //西瓜生产工厂
    public class WatermelonFactory :IWatermelon
    {
        public void product()
        {
            Console.WriteLine("农民伯伯在地里种出西瓜...");        
        }

        public void sell()
        {
            Console.WriteLine("农民伯伯销售西瓜...");
        }
    }

    //西瓜代理商
    public class WatermelonProxy :IWatermelon
    {
        //从农民伯伯手里收购西瓜
        private IWatermelon watermelon;

        public WatermelonProxy (IWatermelon watermelon)
        {
            this.watermelon = watermelon;
        }

        public void product()
        {
            this.watermelon .product ();
            Console.WriteLine("代理商从农民伯伯手里收购西瓜...");
        }

        public void sell()
        {
            Console.WriteLine("代理商从农民手里低价收购西瓜,然后以较高的价格销售,从中赚取一定的差价...");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            //创建西瓜生产工厂
            IWatermelon watermelonFactory = new WatermelonFactory();
            //获得代理对象实例
            IWatermelon watermelonProxy = new WatermelonProxy(watermelonFactory );
            //代理商生产西瓜(其实是农民伯伯种出西瓜)
            watermelonProxy.product();
            //代理商销售西瓜(低价收购西瓜,然后以较高价格出售,赚取差额利润)
            watermelonProxy.sell();
            

        }
    }
}




类图

                                               

代理模式包含如下三个角色:
        Subject(抽象角色):声明真实主题和代理主题的共同接口
        RealSubject(真实角色):真正处理请求的目标对象,客户端可以通过代理角色间接调用真实主题角色中定义的操作。
        Proxy(代理角色):代理对象角色内部含有真是对象的引用,从而代理对象可以将请求转为真实对象处理。 同时,代理对象在执行真实对象操作的前后还可以添加附加操作。


主要优点:

       1.能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。
       2.客户端可以针对抽象主题角色进行编程,增加和更换代理类无须修改源代码,符合开闭原则,系统具有较好的灵活性和可扩展性。
       
 

主要缺点:

       1.由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢,
       2.实现代理模式需要额外的工作,而且有些代理模式的实现过程较为复杂。




使用场合:

       1.远程代理(RemoteProxy)为一个对象在不同的地址空间提供局部代理。
       2.虚拟代理(VirtualProxy)若一个对象的创建非常耗时,可通过代理对象去调用,在真实对象创建前,返回一个假的调用,等真实对象创建好了,这时返回给客户端的就是一个真实对象的响应方法调用。
       3.保护代理(ProtectionProxy)控制对原始对象的访问。
       4.智能指引(SmartReference)取代了简单的指针,它在访问对象时执行一些附加操作。




相关模式:

       装饰者:装饰者重点在与添加附加行为修饰被装饰者。

       代理:代理的重点是代替本人作业,减少对实际对象的操作。












设计模式 之 代理