Java设计模式之代理模式
代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理模式:
人如其名,代理相信大家都可以经常看到什么什么代理,现实中代理太多了。感受最真实的是火车票的代理,经常可以在街上看到,你买票的是在代理商买的,但是付的钱依然会交给铁大哥,这就是代理。现实中的你可能会接触的例子就是叫同学去给你买票,实际上不是你去买,但是是票是你的。这也是代理。
代理模式组成:
抽象角色:通过接口或抽象类声明真实角色实现的业务方法。
代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。
代理的UML图
代理的优点:
(1).职责清晰 真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。叫你去买票,我管你有没有摔跤撒的,不需要关注这种问题。
(2).代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了中介的作用和保护了目标对象的作用。别人在路上一看,以为是你同学要买票去哪里,实际上买的是你的,保护了你。
(3).高扩展性 只要符合火车站规定的人,同学都可以去代人买票。
下面就用代码来实现着一个过程。
1 package com.roc.prory; 2 3 /** 4 * 定义一个种类的人 抽象角色 5 * 6 * @author liaowp 7 * 8 */ 9 public interface Person { 10 11 /** 12 * 可以去火车站买票 13 */ 14 public void buyTicket(); 15 16 }
package com.roc.prory; /** * 小王 代理角色 * @author liaowp * */ public class XiaoWang implements Person { private Person person = null;//默认就是一个人 public XiaoWang(){//小王比较聪明,知道带别人买票赚钱。默认是只赚小明的钱 this.person = new XiaoMing(); } public XiaoWang(Person per){//赚小明的不够,只要是人就赚。 this.person = per; } /** * 小王也是人,也可以去买票。 */ public void buyTicket() {//调不然方法去买票,代理商 this.person.buyTicket(); } }
package com.roc.prory; /** * 小明 真实角色 * @author liaowp * */ public class XiaoMing implements Person { //比较懒 /* * 小明也是人,也可以去买票。 * @see com.roc.prory.Person#buyTicket() */ @Override public void buyTicket() { System.out.println("买小明的票"); } }
package com.roc.prory; /** * 小丽 * @author liaowp * */ public class XiaoLi implements Person { /** * 小丽也可以自己买票。 */ public void buyTicket() { System.out.println("买小丽的票"); } }
package com.roc.prory; /** * 测试代理模式 * @author liaowp * */ public class Client { public static void main(String[] args) { XiaoWang xiaoWang = new XiaoWang();//new 的小王 xiaoWang.buyTicket();//小王去买了小明的票,这就是代理 XiaoLi xiaoLi = new XiaoLi();//买票也要有这个人呀。先把小丽 new 出来。 XiaoWang mrWang = new XiaoWang(xiaoLi);//小丽说:小王帮我去买个票呗 mrWang.buyTicket();//屁颠屁颠的跑去买了 } }
作者:鹏鹏
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。如有问题请联系906522957@qq.com