(5.1)代理模式之静态代理

一、模式的使用场景

就是一个人或者机构代表另一个人或者机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

二、 主要作用

通过引入代理对象的方式来间接访问目标对象

三、解决的问题

防止直接访问目标对象给系统带来的不必要复杂性。

四、代理模式包含的角色

  • Subject:抽象主题角色。可以是接口,也可以是抽象类。
  • RealSubject:真实主题角色。业务逻辑的具体执行者。
  • ProxySubject:代理主题角色。内部含有RealSubject的引用,负责对真实角色的调用,并在真实主题角色处理前后做预处理和善后工作。

五、模型原理

六、代码

代购(代理对象) 代替 我(真实对象) 去买Mac(间接访问的操作)

步骤1: 创建抽象对象接口(Subject):声明你(真实对象)需要让代购(代理对象)帮忙做的事(买Mac)

public interface Subject {  
              public void buyMac();
}

步骤2: 创建真实对象类(RealSubject),即”我“

  public class RealSubject implement Subject{
    @Override
    public void buyMac() {  
        System.out.println(”买一台Mac“);  
    }  
}

 步骤3: 创建代理对象类(Proxy),即”代购“,并通过代理类创建真实对象实例并访问其方法

public class Proxy  implements Subject{


      //引用并创建真实对象实例,即”我“
      RealSubject realSubject = new RealSubject();
 
     @Override
     public void buyMac{

      //调用真实对象的方法,进行代理购买Mac
      realSubject.buyMac();
      //代理对象额外做的操作
      this.WrapMac();
    }

     public void WrapMac(){
      System.out.println(”用盒子包装好Mac“);  
    }
}

步骤4: 客户端调用


public class ProxyPattern {

    public static void main(String[] args){

    Subject proxy = new Proxy();
    proxy.buyMac();
    }

}

 

七、代理模式优点、缺点:

优点:

  • 职责清晰 真实角色只需关注业务逻辑的实现,非业务逻辑部分,后期通过代理类完成即可。
  • 高扩展性 不管真实角色如何变化,由于接口是固定的,代理类无需做任何改动。

缺点:

  • 1)代理类和委托类实现了相同的接口,代理类通过委托类实现了相同的方法。这样就出现了大量的代码重复。如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。增加了代码维护的复杂度。

    2)代理对象只服务于一种类型的对象,如果要服务多类型的对象。势必要为每一种对象都进行代理,静态代理在程序规模稍大时就无法胜任了

    举例说明:代理可以对实现类进行统一的管理,如在调用具体实现类之前,需要打印日志等信息,这样我们只需要添加一个代理类,在代理类中添加打印日志的功能,然后调用实现类,这样就避免了修改具体实现类。满足我们所说的开闭原则。但是如果想让每个实现类都添加打印日志的功能的话,就需要添加多个代理类,以及代理类中各个方法都需要添加打印日志功能(如上的代理方法中删除,修改,以及查询都需要添加上打印日志的功能)
    即静态代理类只能为特定的接口(Service)服务。如想要为多个接口服务则需要建立很多个代理类。

转载:https://blog.csdn.net/carson_ho/article/details/54910472

           http://www.importnew.com/26116.html

posted @ 2019-03-27 08:49  测试开发分享站  阅读(112)  评论(0编辑  收藏  举报