二 代理模式【Proxy Pattern】 来自CBF4LIFE 的设计模式
什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢就先找我的代理人吧,那代理人总要知道
被代理人能做哪些事情不能做哪些事情吧,那就是两个人具备同一个接口,代理人虽然不能干活,但是被
代理的人能干活呀。
比如西门庆找潘金莲,那潘金莲不好意思答复呀,咋办,找那个王婆做代理,表现在程序上时这样的:
先定义一种类型的女人:
package proxyPartern; /** * @author lhb * @类名 IWoman * @描述 定义一种类型的女人,王婆和潘金莲都属于这个类型的女人 * @时间 2022/6/8 11:09 * @版本 **/ public interface IWoman { //抛媚眼 public void makeEyessWithMan(); //和男人快乐 public void happyWithMan(); }
一种类型嘛,那肯定是接口,然后定义潘金莲:
package proxyPartern; /** * @author lhb * @类名 PanJinLian * @描述 定一个潘金莲是什么样的人 * @时间 2022/6/8 11:13 * @版本 **/ public class PanJinLian implements IWoman{ @Override public void makeEyessWithMan() { System.out.println("pin jin lian can make eyes to man!"); } @Override public void happyWithMan() { System.out.println("pin jin lian happy with man!"); } }
再定一个丑陋的王婆: 专门代理各种不安分的美眉
package proxyPartern; /** * @author lhb * @类名 WangPo * @描述 王婆这个人老聪明了,她太老了,是个男人都看不上, 但是她有智慧有经验呀,她作为一类女人的代理! * @时间 2022/6/8 11:15 * @版本 **/ public class WangPo implements IWoman{ private IWoman panJinLian; public WangPo(IWoman woman){ this.panJinLian = woman; } @Override public void makeEyessWithMan() { //王婆这么大年龄了,谁看她抛媚眼?! this.panJinLian.makeEyessWithMan(); } public IWoman getPanJinLian() { return panJinLian; } public void setPanJinLian(IWoman panJinLian) { this.panJinLian = panJinLian; } @Override public void happyWithMan() { //王婆这么大年纪了.干部了了.直接交给潘金莲吧. this.panJinLian.happyWithMan(); } }
两个女主角都上场了,男主角也该出现了: 西门庆开始召唤王婆......
package proxyPartern; /** * @author lhb * @类名 XiMenQing * @描述 定义一个西门庆,这人色中饿鬼 * @时间 2022/6/8 11:19 * @版本 **/ public class XiMenQing { /** 水浒里是这样写的:西门庆被潘金莲用竹竿敲了一下难道,痴迷了, * 被王婆看到了, 就开始撮合两人好事,王婆作为潘金莲的代理人 * 收了不少好处费,那我们假设一下: * 如果没有王婆在中间牵线,这两个不要脸的能成吗?难说的很! */ public static void main(String[] args) { //西门庆喊王婆出厂 WangPo wangPo = new WangPo(new PanJinLian()); //虽然王婆在做.其实是代理人在爽 wangPo.makeEyessWithMan(); wangPo.happyWithMan(); } }
王婆是个万能的代理人. 咱们再让他代理一个国际友人苍老师
先定义苍老师
package proxyPartern; /** * @author lhb * @类名 CangLaoShi * @描述 苍老师 可是万能的.和谁都能happy. * @时间 2022/6/8 11:41 * @版本 **/ public class CangLaoShi implements IWoman{ @Override public void makeEyessWithMan() { System.out.println("cang laoshi make some eyes to some body"); } @Override public void happyWithMan() { System.out.println("cang laoshi make make happy wiht some body"); } }
西门庆又来召唤 王婆了.
package proxyPartern; /** * @author lhb * @类名 XiMenQing * @描述 定义一个西门庆,这人色中饿鬼 * @时间 2022/6/8 11:19 * @版本 **/ public class XiMenQing { /** 水浒里是这样写的:西门庆被潘金莲用竹竿敲了一下难道,痴迷了, * 被王婆看到了, 就开始撮合两人好事,王婆作为潘金莲的代理人 * 收了不少好处费,那我们假设一下: * 如果没有王婆在中间牵线,这两个不要脸的能成吗?难说的很! */ public static void main(String[] args) { //西门庆喊王婆出厂 WangPo wangPo = new WangPo(new PanJinLian()); //虽然王婆在做.其实是代理人在爽 wangPo.makeEyessWithMan(); wangPo.happyWithMan(); //第二天 再次呼唤王婆 代理苍老师了. 前提西门庆知道王婆代理谁 wangPo = new WangPo(new CangLaoShi()); //虽然王婆在做.其实是代理的人苍老师在干活 wangPo.makeEyessWithMan(); wangPo.happyWithMan(); } }
说完这个故事,那额总结一下,代理模式主要使用了 Java 的多态,干活的是被代理类,代理类主要是
接活,你让我干活,好,我交给幕后的类去干,你满意就成,那怎么知道被代理类能不能干呢?同根就成,
大家知根知底,你能做啥,我能做啥都清楚的很,同一个接口呗 同一个接口呗 同一个接口呗。
浙公网安备 33010602011771号