案例:西门庆追求潘金莲,王婆做代理
先定义一个接口,表示一类女人:
/**
* @Description:
* 定义一种类型的女人,王婆和潘金莲都属于这个类型的女人
*/
public interface KindWomen {
// 抛媚眼
public void makeEyesWithMan();
// ...
public void happyWithMan();
}
两个具体实现类:
/**
* @Description 潘金莲
*/
public class PanJinLian implements KindWomen {
@Override
public void makeEyesWithMan() {
System.out.println("潘金莲抛媚眼...");
}
@Override
public void happyWithMan() {
System.out.println("潘金莲在和男人...");
}
}
/**
* @Description 王婆,代理类
*/
public class WangPo implements KindWomen {
private KindWomen kindWomen;
// 默认是潘金莲的代理
public WangPo() {
this.kindWomen = new PanJinLian();
}
// 可以是KindWomen接口的任何一个实现类的代理
public WangPo(KindWomen kindWomen) {
this.kindWomen = kindWomen;
}
@Override
public void makeEyesWithMan() {
// 其代理的女人抛媚眼
this.kindWomen.makeEyesWithMan();
}
@Override
public void happyWithMan() {
// 其代理的女人和男人..
this.kindWomen.happyWithMan();
}
}
西门庆,客户端类:
/**
* @Description 西门庆
*/
public class XiMenQing {
public static void main(String[] args) {
// 把王婆叫出来
WangPo wangPo = new WangPo();
// 表面看是王婆和西门庆在搞事,实际上是潘金莲
wangPo.makeEyesWithMan();
wangPo.happyWithMan();
}
}
扩展起来也比较方便,增加一个实现类:
/**
* @Description 贾氏
*/
public class JiaShi implements KindWomen {
@Override
public void makeEyesWithMan() {
System.out.println("贾氏抛媚眼...");
}
@Override
public void happyWithMan() {
System.out.println("贾氏正在...");
}
}
客户端修改:
public class XiMenQing {
public static void main(String[] args) {
JiaShi jiaShi = new JiaShi();
WangPo wangPo = new WangPo(jiaShi);
wangPo.makeEyesWithMan();
wangPo.happyWithMan();
}
}
总结一下代理模式:利用Java的多态特性,具体实现业务逻辑的是被代理类,代理类给客户端提供调用,代理将具体的业务逻辑交由具体的业务实现类去做。
类图:
本文原书:《您的设计模式》作者:CBF4LIFE