设计模式(7)代理模式(讲解+应用)

553 查看

目录

  1. 代理模式

  2. 为什么使用代理模式

  3. 应用实例

代理模式

对于代理模式,和委托方式分不开,感觉委托和代理没有什么区别,而委托却不被称做一个设计模式,今天再次看代理模式,才有所理解。从这一点也发现了一个问题,有些时候,我们再去看一本技术的书的时候,第一遍有些概念往往晦涩难懂,特别是在未看设计模式去看《Thinking in Java》的时候,当时看的就会有点小焦虑,看不下去,想跳过去吧,有会有种自我谴责的意识出现,现在看来对于一些概念不懂的甚至是一知半解的,其实没有必要去死扣,跳过去接着看,然后等着再回过头看一遍,很多概念就不会让你感觉像是第一次那样晦涩,同时对于一些好书,即使第一次看过去,感觉没什么问题,在回读一遍,你还是会发现会有不同的理解和感悟的。
回到正题

代理模式:为对象提供一个替身或者是占一个位子,从而控制对其访问。

代理VS委托*
而我们常用的委托呢?是在类的内部创建一个局部变量,用来表示该对象,然后通过某种方法或者是构造函数将实例注入,这看起来确实是给对象占了一个位子,但是注意代理模式的主要目的是用来控制对其访问,而我们使用的委托模式是起不到的这个作用的,因为实例都是通过方法从外部注入进来的,又谈何对其在类内部进行访问控制。

为什么使用代理模式

当我们有一个数据集,不同的用户对该数据集有不同的权限,因此如果我们对控制数据集的对象进行权限的设定以此来控制我们数据的存取,从而对我们的数据起到一个保护的作用。

主题抽象类 
 abstract   public   class  Subject  {
    abstract   public   void  request(); 
}   


真实主题类 
 public   class  RealSubject  extends  Subject  { 
     public  RealSubject()  { }  
    
     public   void  request()  { 
        System.out.println( " From real subject. " ); 
    }  
}  


代理类
public   class  ProxySubject  extends  Subject  { 
     private  RealSubject realSubject;  // 以真实角色作为代理角色的属性  
 
      public  ProxySubject()  { }  


     public   void  request()  {  // 该方法封装了真实对象的request方法  
         preRequest(); 

         if ( realSubject  ==   null  )  { 

            realSubject  =   new  RealSubject(); 
        }  

        realSubject.request();  // 此处执行真实对象的request方法  
 
        postRequest(); 
    } 
 

通过一个代理类,将我们真实的实例作为一个属性,然后在代理类中执行相应的操作。有什么用途呢,比如上面某一个主题的一个方法并不是对没一个用户都开发权限的,所以在进行操作之前,我们要对该权限进行一个判断,这样我们可以在代理类中进行一个判断,同时还可以在执行完方法之后进行一下其它的操作。

应用实例

现实中的应用的比较多的有远程代理,本地的对象,在服务端还有一个对象,服务端对对象执行的操作,本地端就会执行,但是碍于对其了解不深,也咩有拿这个来举例子,实际开发中用到代理的还有很多地方,比如

防火墙代理:对网络资源进行保护,防止恶意侵害

缓存代理:为开销大的计算结果提供缓存

等等,

下篇更模板方法,对于模板方法和钩子方法通过Android的View相关进行举例。