代理模式是一种使用率非常高的模式,定义如下:为其他对象提供一种代理以控制这个对象的访问。
从通用类图中可以看出代理模式涉及到三个类:
1.Subject抽象主题角色
抽象主题类可以是抽象类也可以是接口,上面的类图使用的抽象类
2.具体主题角色
也可以称为被委托角色,是业务逻辑的具体执行者
3.Proxy代理角色
它负责对真是角色的应用,把所有抽象的主题类定义的方法限制委托给真是的主题角色实现,并且在真是的主题角色处理完毕前后做预处理和善后的工作
代码如下:
/** * 抽象主题类 */ public abstract class Subject { // 抽象主题的方法 protected abstract void request(); }
/** * 真实的主题角色 * */ public class RealSubject extends Subject { /** * 具体的实现逻辑 */ @Override protected void request() { System.out.println("收到请求...."); } }
/** * 代理类 * */ public class Proxy extends Subject { private Subject subject; public Proxy(Subject subject) { this.subject = subject; } /** * 代理类同真是的主题角色实现同一个抽象类或者接口, * 因为代理类是要代理真实的角色,既然是代理,那么代理就应该具有真是角色拥有的功能 */ @Override protected void request() { System.out.println("开始时间"); subject.request(); System.out.println("结束时间"); } }
public class Client { public static void main(String[] args) { Proxy proxy=new Proxy(new RealSubject()); proxy.request(); } }
可能有的人会说,我不用代理也能输出程序的执行时间啊,为什么非用代理呢,我们知道模式这种东西的出现主要是为了解决程序的复用性的、灵活性问题的,就拿输出程序的执行来说,如果我们有多个类都需要输出时间,我们只是将输出时间的功能硬编码到程序里,那么将来有一天程序要上线了需要我们去掉输出,那么想想你的工作量吧。
我们使用代理就是为了增强真是主题的执行逻辑,就想上面的代码中在真是逻辑执行前后输出时间一样,其实代理处理和真实主题除了必须继承或实现同一个接口外,代理类本身也可以单独继承或实现另一个接口。场景如下:
上一篇我们介绍的说的建造者模式中,小明最终花了5000元组装了一个电脑,现在几乎不上课,天天打游戏,可是有小明发现舍友小强平时不怎么打游戏,该上课上课,该泡妞泡妞,可是他的游戏级别却比自己的高,有一天宿舍在一起喝酒,小明就将自己的疑问说了出来,小强说:“你傻呀,你不知道游戏圈有代练啊”,小明这才恍然大悟,于是乎拿起手机就给他爸打了过说:“爸,学校需要买一些考试资料需要一点钱.....”,钱拿到之后,小明也找了代练,但是小明仍然不去上课,只是可以多睡一会了.....
上述场景的类图如下:
代码实现如下:
public interface GamePlayer { // 打怪 public void daguai(); // 升级 public void upgrade(); }
/** * 小明 * */ public class Xiaoming implements GamePlayer { /** * 打怪 */ @Override public void daguai() { System.out.println("开始打怪了....."); } /** * 升级 */ @Override public void upgrade() { System.out.println("升级了...."); } }
/** * * 代练 */ public class GamePlayerProxy implements GamePlayer, Billing { private GamePlayer player; public GamePlayerProxy(GamePlayer player) { this.player = player; } /** * 打怪 */ @Override public void daguai() { player.daguai(); } /** * 升级 */ @Override public void upgrade() { player.upgrade(); // 计费 this.account(); } /** * 计费 */ @Override public void account() { System.out.println("计费成功"); } }
/** * 计费接口 * */ public interface Billing { // 计费 public void account(); }
/** * * */ public class Client { public static void main(String[] args) { Xiaoming xiaoming = new Xiaoming(); GamePlayerProxy gamePlayerProxy = new GamePlayerProxy(xiaoming); gamePlayerProxy.daguai(); gamePlayerProxy.upgrade(); } }
相关推荐
Java设计模式之代理模式(结构)Java设计模式之代理模式(结构)Java设计模式之代理模式(结构)Java设计模式之代理模式(结构)Java设计模式之代理模式(结构)
.net实现设计模式之代理模式
设计模式之代理模式 学习
JAVA设计模式之代理模式实例
面向对象23种设计模式之代理模式,简单明了。面向对象23种设计模式之代理模式,简单明了。
该代码是android应用设计模式之代理模式小例子
大话设计模式之代理模式 经典代码 C#类
Android设计模式之代理模式(Proxy Pattern)
Java设计模式之代理模式 1.代理模式 1.1 静态代理 1.2 动态代理 1.3.代理模式使用原因和应用方面
设计模式之代理模式Java实现和类设计图,包括静态代理和动态代理
Java设计模式之代理模式[收集].pdf
为其他对象提供一个代理以控制对这个对象的访问。