代理模式是一种使用率非常高的模式,定义如下:为其他对象提供一种代理以控制这个对象的访问。
从通用类图中可以看出代理模式涉及到三个类:
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(); } }
相关推荐
**设计模式之代理模式(Proxy Pattern)** 设计模式是软件工程中的一种最佳实践,它是在特定情境下解决常见问题的模板。代理模式是其中一种行为设计模式,它的核心思想是为一个对象提供一个替身或者代理,以控制对...
根据提供的标题“深入浅出设计模式之代理模式”与描述“将《Head First 设计模式》(中文版)按章节进行了分割,每章一个文件,方便大家下载”,我们可以推测出这部分内容主要聚焦于介绍和解释代理模式这一重要的设计...
代理模式是一种在软件设计中广泛使用的行为设计模式,它的核心思想是为...通过观看"设计模式之代理模式视频教学",你可以系统地学习代理模式的理论知识和实践技巧,提升自己的设计能力,更好地应对复杂的软件开发挑战。
大话设计模式之代理模式 经典代码 C#类
Java设计模式之代理模式 1.代理模式 1.1 静态代理 1.2 动态代理 1.3.代理模式使用原因和应用方面
代理模式是一种常用的设计模式,它在软件工程中扮演着重要的角色,特别是在.NET框架下。代理模式的核心思想是为一个对象提供一个替代品或代表,这个替代品能够控制对原对象的访问,使得客户端代码可以通过代理对象与...
### Java设计模式之虚拟代理模式详解 #### 一、引言 在软件工程领域,设计模式作为一种被广泛接受的最佳实践,对于提高代码质量和可维护性起着至关重要的作用。其中,“代理模式”作为结构型设计模式之一,在解决...
代理模式是一种常用的设计模式,它在软件开发中起到了中介或者代表的作用。代理模式的主要目的是为其他对象提供一种代理以控制对这个对象的访问。通过引入代理,我们可以增加新的功能,如缓存、日志记录、访问控制等...
代理模式是设计模式的一种,它提供了一种对目标对象进行增强或者控制访问的方式。在本实例中,我们将深入探讨Java中的代理模式及其应用。 代理模式的核心思想是为一个对象创建一个代理对象,这个代理对象在客户端和...
代理模式是面向对象设计模式中的一个关键概念,它在软件工程中扮演着重要角色,用于在客户端和目标对象之间创建一种代理关系,以提供额外的功能或控制。在代理模式中,代理类作为真实对象的代表,它可以在客户端与...
代理模式是设计模式中的一种结构型模式,它在对象交互中起到了中介的作用,允许通过代理对象来控制对原对象的访问。代理模式的核心思想是为一个对象提供一个替身,以便增加新的功能或者控制对原对象的访问。这种模式...
Java设计模式之代理模式[收集].pdf