定义:代理模式就是给一个对象提供一个代理对象,由这个代理对象控制对原对象的引用,使代理类在客户端和原对象之间起到一个中介的作用。
简单来说就是一个:客户->经纪人(代理人)->卖家 的三边关系
UML如下:
如图所示,代理模式包括以下几个角色:
1、接口-Person,用来规范被代理类和代理类之间的行为,类似房东和经纪人之间的合作协议,规范哪些行为可以做,哪些不可以。代码层面就是将代理类和被代理类的共同方法抽象出来,如图中的sellHouse
2、代理类-Agent,该类被客户直接访问,作为买方客户和卖方之间的桥梁,该类和被代理的类实现同样的接口Person,并且都实现sellHouse方法,并且Agent类引用了一个被代理类HouseOwner的对象
3、被代理类-HouseOwner,卖方,不直接与客户接触,只有等到经纪人说可以卖了,直接过来签合同(执行sellHouse方法)
4、客户类-Client,外围的调用类
以下是该模式的代码,比较简单:
/**
* 接口类
* @author saisaimayi
*
*/
public interface Person {
public void sellHouse();
}
/**
* 代理类
* @author saisaimayi
*
*/
public class Agent implements Person {
private Person houseOwner;
public Agent(Person houseOwner){
this.houseOwner = houseOwner;
}
public void sellHouse() {
receiveCustomer();
houseOwner.sellHouse();
dealWithEndAffair();
}
private void dealWithEndAffair() {
System.out.println("处理善后事务...");
}
private void receiveCustomer() {
System.out.println("接待客户...");
}
}
/**
* 代理类
* @author saisaimayi
*
*/
public class Agent implements Person {
private Person houseOwner;
public Agent(Person houseOwner){
this.houseOwner = houseOwner;
}
public void sellHouse() {
receiveCustomer();
houseOwner.sellHouse();
dealWithEndAffair();
}
private void dealWithEndAffair() {
System.out.println("处理善后事务...");
}
private void receiveCustomer() {
System.out.println("接待客户...");
}
}
/**
* 客户类
* @author saisaimayi
*
*/
public class Client extends TestCase {
public void test(){
Person owner = new HouseOwner();
Agent agent = new Agent(owner);
agent.sellHouse();
}
}
运行结果如下:
接待客户...
sell the house...
处理善后事务...
总结:代理模式在结构上其实与装饰者模式有相似之处,都是继承具有相同结构的父类或者接口,然后代理类对应装饰者类,都持有一个对核心类的引用。然后都是用自身的方法调用核心类的同名方法。