参考:设计模式之禅
代理模式
什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢就先找我的代理人吧,那代理人总要知道
被代理人能做哪些事情不能做哪些事情吧,那就是两个人具备同一个接口,代理人虽然不能干活,但是被
代理的人能干活呀。
比如西门庆找潘金莲,那潘金莲不好意思答复呀,咋办,找那个王婆做代理,
类图
省略
实现
1. 先定义一种类型的女人
KindWomen.java
package DesignModel;
/**
* 定义一种类型的女人,王婆和潘金莲都属于这个类型的女人
*/
public interface KindWomen {
//这种类型的女人能做什么事情呢?
public void makeEyesWithMan(); //抛媚眼
public void happyWithMan(); //Do happy things
}
2. 定义潘金莲
PanJinLian.java
package DesignModel;
/**
* 定义一个潘金莲是什么样的人
*/
public class PanJinLian implements KindWomen {
@Override
public void makeEyesWithMan() {
System.out.println("潘金莲抛媚眼");
}
@Override
public void happyWithMan() {
System.out.println("潘金莲在和男人做快乐的事情");
}
}
3. 再定王婆
WangPo.java
package DesignModel;
/**
* 王婆这个人老聪明了,她太老了,是个男人都看不上,
* 但是她有智慧有经验呀,她作为一类女人的代理!
*/
public class WangPo implements KindWomen {
private KindWomen mKindWomen;
/**
* 默认是潘金莲的代理
*/
public WangPo() {
mKindWomen = new PanJinLian();
}
/**
* 设置被代理人
* @param kindWomen 被代理者的实例
*/
public WangPo(KindWomen kindWomen) {
mKindWomen = kindWomen;
}
@Override
public void makeEyesWithMan() {
mKindWomen.makeEyesWithMan(); //自己老了,干不了,可以让年轻的代替
}
@Override
public void happyWithMan() {
mKindWomen.happyWithMan(); //王婆这么大年龄了,谁看她抛媚眼?!
}
}
4. 定义卢俊义的老婆贾氏
那我们再考虑一下,水浒里还有没有这类型的女人?有,卢俊义的老婆贾氏(就是和那个固管家苟合
的那个),这名字起的:“假使”,那我们也让王婆做她的代理:
把贾氏素描出来:
JiaShi.java
package DesignModel;
public class JiaShi implements KindWomen {
@Override
public void makeEyesWithMan() {
System.out.println("贾氏抛媚眼");
}
@Override
public void happyWithMan() {
System.out.println("贾氏正在Happy中......");
}
}
5. 定义西门庆
XiMenQing.java
package DesignModel;
/**
* 定义一个西门庆
*/
public class XiMenQing {
public static void main(String[] args) {
//把王婆叫出来
WangPo wangPo = new WangPo();
//然后西门庆就说,我要和潘金莲happy,然后王婆就安排了西门庆丢筷子的那出戏:
wangPo.makeEyesWithMan(); //看到没,虽然表面上时王婆在做,实际上爽的是潘金莲
wangPo.happyWithMan();
//改编一下历史,贾氏被西门庆勾走:
JiaShi jiaShi = new JiaShi();
WangPo wangPo2 = new WangPo(jiaShi); //让王婆作为贾氏的代理人
wangPo2.makeEyesWithMan();
wangPo2.happyWithMan();
}
}
运行结果
潘金莲抛媚眼
潘金莲在和男人做快乐的事情
贾氏抛媚眼
贾氏正在Happy中......