zoukankan      html  css  js  c++  java
  • 设计模式-代理模式(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();

    结果

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

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

    请多多指教~

  • 相关阅读:
    使用springamqp发送消息及同步接收消息
    对未登陆的用户进行处理的页面
    查找某些字符是否在另一个字符串里出现的高效算法
    正则表达式
    华中地区高校第七届ACM程序设计大赛——递增序列【2012年5月27日】
    HDOJ2021 ( 发工资咯:) ) 【水题】
    循环冗余校验(CRC)【C语言 位运算】
    HDOJ2028 ( Lowest Common Multiple Plus ) 【水题,lcm】
    HDOJ2015 ( 偶数求和 ) 【水题】
    HDOJ2027 ( 统计元音 ) 【水题】
  • 原文地址:https://www.cnblogs.com/sayook/p/9104655.html
Copyright © 2011-2022 走看看