定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
理解:代理模式就是将对象的能力委托给其他对象进行访问和执行,同时其他对象也拥有对象的相同能力。
这个设计模式,可以运用于集成redis、monggo等相关组件时,将存和取数据定义成“缓存”类型的两个功能,再定义“代理缓存”来代理“redis缓存”,这样往后扩展或者更换成其他缓存方法时,可直接修改“代理缓存”对象代理的对象,而不需要去修改业务代码;
场景:比如西门庆找潘金莲,那潘金莲不好意思答复呀,咋办,找那个王婆做代理,表现在程序上时这样的:
第一步,先定义一种类型的女人:
public interface KindWomen {
public void makeEyesWithMan();
public void happyWithMan();
}
第二步,定一个潘金莲:
public class PanJinLian implements KindWomen {
@Override
public void makeEyesWithMan() {
System.out.println("潘金莲抛媚眼");
}
@Override
public void happyWithMan() {
System.out.println("潘金莲正在happy中......");
}
}
第三步,再定一个丑陋的王婆:
public class WangPo implements KindWomen {
private KindWomen kindWomen;
public WangPo() {
this.kindWomen = new PanJinLian();
}
public WangPo(KindWomen kindWomen) {
this.kindWomen = kindWomen;
}
@Override
public void makeEyesWithMan() {
this.kindWomen.makeEyesWithMan();
}
@Override
public void happyWithMan() {
this.kindWomen.happyWithMan();
}
}
第四步,定义西门庆通过王婆勾搭潘金莲:
public class XiMenQing {
public static void main(String[] args) {
WangPo wangPo = new WangPo();
wangPo.makeEyesWithMan();
wangPo.happyWithMan();
}
}
第五步扩展,西门庆也可以通过代理人王婆勾搭其他女人:
比如定义贾氏:
public class JiaShi implements KindWomen {
@Override
public void makeEyesWithMan() {
System.out.println("贾氏抛媚眼");
}
@Override
public void happyWithMan() {
System.out.println("贾氏正在happy中......");
}
}
西门庆勾搭贾氏:
public class XiMenQing2 {
public static void main(String[] args) {
JiaShi jiaShi = new JiaShi();
WangPo wangPo = new WangPo(jiaSh);
wangPo.makeEyesWithMan();
wangPo.happyWithMan();
}
}