设计模式-代理模式(Proxy)

简介:

为其他对象提供一种代理以控制对这个对象的访问。(在访问真实对象时,引入一定程度的间接性,因为这种间接性可以附加多种用途)【结构型模式】


结构图:

 


优点:

  1. 高扩展性;
  2. 代理作为调用者和真实对象的中间层,降低了模块间的耦合性。

缺点:

  1. 由于在客户端和真实对象之间增加了代理对象,因此有些类型的代理模式可能会造成请求处理的速度变慢;
  2. 实现代理模式需要增加额外的代码,有些代码模式的实现可能很复杂。

应用场景:

  1. 远程代理:为一个对象在不同的地址空间提供局部代表,这样可以隐藏这个对象存在于不同地址空间的事实;
  2. 安全代理:用来控制真实对象访问时的权限;
  3. 虚拟代理:在创建一些占用大量内存或处理复杂的对象时,虚拟代理把这些对象推迟到真正使用它们时创建。对象被应用在第一次引用时创建,并同一个实例被重复使用;
  4. 智能指引:当调用真实对象时,代理可以做一些其他的逻辑。

注意事项:

  1. 和装饰模式的区别:装饰模式为了增强功能,代理模式为了加以控制;
  2. 和适配器模式的区别:适配器模式主要改变所考虑对象的接口,代理模式不能改变所代理类的接口。

示例:

1.结构类图的实现:

ISubject类,定义了RealSubjectProxy的公用接口。在任何使用RealSubject的地方都可以使用Proxy

RealSubject类,定义Proxy所代表的真实实体。

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

    /// <summary>
    /// 主题
    /// </summary>
    public interface ISubject
    {
        void Request();
    }
    /// <summary>
    /// 真实主题
    /// </summary>
    public class RealSubject : ISubject
    {
        public void Request()
        {
            Console.WriteLine("真实的请求");
        }
    }
    /// <summary>
    /// 代理类
    /// </summary>
    public class Proxy : ISubject
    {
        RealSubject real;
        public void Request()
        {
            if (real == null) real = new RealSubject();
            real.Request();
        }
    }

 客户端

 Proxy proxy = new Proxy();
 proxy.Request();

结果

2.代理模式之撩妹

撩妹的最高境界就是,不用自己亲自出马,找个代理人送花,送巧克力就行。撩妹就是【Subject】,追求者就是【RealSubject】,代理人就是【Proxy】了。

美女和撩妹技巧

    /// <summary>
    /// 美女
    /// </summary>
    public class Beauty
    {
        public string Name;
        public Beauty(string name)
        {
            Name = name;
        }
    }
    /// <summary>
    /// 撩妹技巧
    /// </summary>
    public interface IChaseGirl
    {
        /// <summary>
        /// 送花
        /// </summary>
        void GiveFlowers();
        /// <summary>
        /// 送巧克力
        /// </summary>
        void GiveChocolate();
    }

 追求者和代理人

    /// <summary>
    /// 追求者
    /// </summary>
    public class Pursuit : IChaseGirl
    {
        private Beauty mm;
        public Pursuit(Beauty mm)
        {
            this.mm = mm;
        }
        public void GiveChocolate()
        {
            Console.WriteLine("送给{0}的巧克力~", mm.Name);
        }
        public void GiveFlowers()
        {
            Console.WriteLine("送给{0}的花~", mm.Name);
        }
    }
    /// <summary>
    /// 代理者
    /// </summary>
    public class Proxy: IChaseGirl
    {
        /// <summary>
        /// 真实追求者
        /// </summary>
        private Pursuit pursuit;
        public Proxy(Beauty mm)
        {
            pursuit = new Pursuit(mm);
        }
        public void GiveChocolate()
        {
            pursuit.GiveChocolate();
        }
        public void GiveFlowers()
        {
            pursuit.GiveFlowers();
        }
    }

客户端

 Beauty mm = new Beauty("紫霞仙子");
 Proxy proxy = new Proxy(mm);
 proxy.GiveChocolate();
 proxy.GiveFlowers();

结果

话说紫霞仙子最后爱上了谁呢?追求者还是代理者?当然代理者啦,东西虽然真实的送出者是追求者,但整个过程中他的面都没有露过啊。

撩妹都要用代理模式,这难道就是程序猿单身的原因?

请多多指教~

posted @ 2018-05-29 16:24  稻草堆上打着滚儿  阅读(347)  评论(0编辑  收藏  举报