概述:
代理模式(Proxy Pattern),23种常用的面向对象软件的设计模式之一。为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
组成:
抽象角色,一般是接口,声明具体业务方法
代理角色,实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
真是角色(目标角色),实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。
案例:
场景:你想租房子,但是找不到房子的房东,这时候通过中介来租房东的房子。
房东信息:
/** * 房东类 */ public class Landlord { private String name; public Landlord(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
首先定义租赁的接口:
/** * 租赁接口 */ public interface Renting { public void rentingHouse(); }
然后是租客和中介,都需要实现租赁接口
租客(目标角色):
/** * 租客类(目标类,被代理类) */ public class Tenant implements Renting { Landlord landlord; public Tenant(Landlord landlord) { this.landlord = landlord; } @Override public void rentingHouse() { System.out.println(landlord.getName() + ",我要租你的房子..."); } }
中介(代理角色):
/** * 中介代理类 */ public class IntermediaryProxy implements Renting { Tenant tenant; public IntermediaryProxy(Landlord landlord) { tenant = new Tenant(landlord); } @Override public void rentingHouse() { System.out.println("中介为你服务..."); tenant.rentingHouse(); } }
租赁行为(测试代码):
public class ClientClass { public static void main(String[] args) { Landlord landlord = new Landlord("张学友"); IntermediaryProxy proxy = new IntermediaryProxy(landlord); proxy.rentingHouse();; } }
可以看出我们的代码中,并没有出现租客的信息,因为他把租房子的行为全权让中介代理了,这也就是所说的 代理拥有目标的绝对控制权。
运行结果:
其实不难看出,代理模式和装饰模式很相似,个人理解是代理模式中,代理类对被代理的对象有控制权,决定其执行或者不执行。而装饰模式中,装饰类对代理对象没有控制权,只能为其增加一层装饰,以加强被装饰对象的功能,就这样。