zoukankan      html  css  js  c++  java
  • 代理模式

      代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问。

      在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

      代理模式的优点:

      (1)、职责清晰,真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。
      (2)、代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了的作用和保护了目标对象的作用。
      (3)、高扩展性

      代理模式的UML图:

          

        代码示例:

    namespace ConsoleApplication1
    {
        abstract class Subject
        {
            public abstract void Request();
        }
    
        class RealSubject : Subject
        {
            public override void Request()
            {
                Console.WriteLine("真实的请求!");
            }
        }
    
        //代理类
        class Proxy : Subject 
        {
            RealSubject realSubject;        //用于装载真实对象
            public override void Request()
            {
                if (realSubject == null)
                {
                    realSubject = new RealSubject();    //获得真实对象
                }
                realSubject.Request();      //调用真实对象的请求方法
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                Proxy proxy = new Proxy();
                proxy.Request();    //输出真实的请求
    
                Console.ReadKey();
            }
        }  
    }

      从代码来看,代理模式的思想是很简单的,难度应该在怎么灵活应用上。

    namespace 代理模式
    {
        class Program
        {
            static void Main(string[] args)
            {
                小夫 proxy = new 小夫();
                proxy.Hit();    //输出真实的请求
    
                Console.ReadKey();
            }
        }
    
        abstract class Subject
        {
            public abstract void Hit();
        }
    
        class 胖虎 : Subject
        {
            public override void Hit()
            {
                Console.WriteLine("揍大雄!");
    
                //Type t = this.GetType();
                //Console.WriteLine("揍大雄的人是:" + t.Name);
            }
        }
    
        //代理类
        class 小夫 : Subject
        {
            胖虎 realSubject;        //把胖虎放到小夫家
            public override void Hit()
            {
                if (realSubject == null)
                {
                    realSubject = new 胖虎();    //胖虎来了
                }
                realSubject.Hit();      //让胖虎揍大雄
            }
        }
    }

      

      典型的应用场景是,当真正的处理类不方便使用时,就可以使用代理模式。

    1. 远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。
    2. 虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。
    3. 安全代理,用来控制真实对象的访问权限,例如上面的代理类没有送巧克力,这样送巧克力的权限就没有了。
    4. 智能指引,是指当调用真实的对象时,代理处理另外一些事。
  • 相关阅读:
    Java接口
    【精】搭建redis cluster集群,JedisCluster带密码访问【解决当中各种坑】!
    java操作redis集群配置[可配置密码]和工具类(比较好用)
    关于Jedis是否线程安全的测试
    RedisDesktopManager如何使用命令行?
    多线程按行读取文件【我】
    根据开始字符串和结束字符串截取文件生成另一个文件(日志处理)【我】
    Redis操作List工具类封装,Java Redis List命令封装
    缓存数据库-redis数据类型和操作(list)
    Redis需要多少内存预留-内存占用多少才安全
  • 原文地址:https://www.cnblogs.com/qixuejia/p/4370273.html
Copyright © 2011-2022 走看看