设计模式----代理模式
今天来介绍一种相对简单的设计模式 ---- 代理模式
比如说你想追一位女生,但是你跟她不熟,就可以找一个你和她都很熟的Proxy(代理)去完成你想要进行的动作
不要想歪哦,我说的是送礼物之类的 (doge)
我们首先来看这个设计模式的类图
是不是很简单哇~
看看代码~
package proxy.template; /**@author 陈柏宇 * Subject类,定义了 RealSubject 和 Proxy(代理) 的共用接口,这样就在任何使用RealSubject * 的地方都可以使用Proxy(代理) * 这个类里面的方法也就是 RealSubject 希望 Proxy(代理) 代理的方法 */ public abstract class Subject { /** * 抽象方法,RealSubject 希望 Proxy(代理) 代理的方法 */ public abstract void request(); }
package proxy.template; /** * @author 陈柏宇 * 真实实体 真正意愿的实体 */ public class RealSubject extends Subject{ @Override public void request() { System.out.println("真实实体的请求"); } }
package proxy.template; /** * @author 陈柏宇 * 代理者 代理真实实体的动作 */ public class Proxy extends Subject{ RealSubject realSubject; @Override public void request() { if(realSubject == null) { realSubject = new RealSubject(); } realSubject.request(); } }
客户端代码:
public static void main(String[] args) { Proxy proxy = new Proxy(); proxy.request(); }
终端显示:
真实实体的请求
接下来我们来看一个例子:比如说你想追一位女生,你让一个人来代理你的动作
package proxy; /** * @author 陈柏宇 * 送礼物接口 代理者代理的我要送的礼物 */ public abstract class IGivePresent { /** * 送玩偶 (不是Hong Kong的那位) */ public abstract void giveDoll(); /** * 送巧克力 */ public abstract void giveChocolate(); /** * 送鲜花 */ public abstract void giveFlower(); }
package proxy; /** * @author 陈柏宇 * 追求者 动作的意愿发起者 */ public class Pursuit extends IGivePresent{ SchoolGirl mm; public Pursuit(SchoolGirl mm) { this.mm = mm; } @Override public void giveDoll() { System.out.println( "送你玩偶,我亲爱的" + mm.getName()); } @Override public void giveChocolate() { System.out.println( "送你巧克力,我亲爱的" + mm.getName()); } @Override public void giveFlower() { System.out.println( "送你鲜花,我亲爱的" + mm.getName()); } }
package proxy; /** * @author 陈柏宇 * 代理,用来发出追求者想发出的动作 */ public class Proxy extends IGivePresent{ Pursuit pursuit; public Proxy(SchoolGirl mm) { this.pursuit = new Pursuit(mm); } @Override public void giveDoll() { pursuit.giveDoll(); } @Override public void giveChocolate() { pursuit.giveChocolate(); } @Override public void giveFlower() { pursuit.giveFlower(); } }
main函数:
public class ProxyTest { public static void main(String[] args) { SchoolGirl mm = new SchoolGirl("beauty"); Proxy p = new Proxy(mm); p.giveChocolate(); p.giveDoll(); p.giveFlower(); } }
控制台输出:
送你巧克力,我亲爱的beauty
送你玩偶,我亲爱的beauty
送你鲜花,我亲爱的beauty
是不是很简单呀~
那么这个设计模式有哪些应用呢?
/** * @author cby * 那么这种设计模式一般用在什么场合呢? * * (1)远程代理,也就是为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象 * 存在于不同地址空间的事实 * 就好比一个快捷方式,我们的桌面图标的应用往往都不在桌面的那个文件夹里 * * (2)虚拟代理,根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象 * 比如你打开一个很大的HTML网页时里面可能有很多的图片和文字,但是你还是可以很快打开它 * 此时你所看到的是所有的文字,但是图片是一张张下载才可以看到,那些未打开的图片框, * 就是通过虚拟代理来替代了真实的图片,此时代理存储了真实图片的路径和尺寸 * * (3)安全代理,用来控制真实对象访问时的权限 * * (4)智能指引:是指当调用真实的对象时,代理处理另外一件事 * */