欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-26 17:58:24
简介: 为其他对象提供一种代理以控制对这个对象的访问。(在访问真实对象时,引入一定程度的间接性,因为这种间接性可以附加多种用途)【结构型模式】 结构图: 优点: 缺点: 应用场景: 注意事项: 示例: 1.结构类图的实现: ISubject类,定义了RealSubject和Proxy的公用接口。在任 ......

简介:

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


结构图:

设计模式-代理模式(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();

结果

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

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();

结果

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

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

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

请多多指教~