一、模式的使用场景

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

二、 主要作用

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

三、解决的问题

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

四、代理模式包含的角色

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

五、模型原理

(5.1)代理模式之静态代理_打印日志

六、代码

代购(代理对象) 代替 我(真实对象) 去买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)服务。如想要为多个接口服务则需要建立很多个代理类。