设计模式之代理模式

一.定义

代理模式(Proxy Pattern)是一个使用率非常高的模式,其定义如下:
Provide a surrogate or placeholder for another object to control access to it. (为其他对象提供一种代理以控制对这个对象的访问。)
具体的类图模板如下:
设计模式之代理模式_第1张图片

  • Subject抽象主题角色
    抽象主题类可以是抽象类也可以是接口,是一个最普通的业务类型定义,无特殊要求。
  • RealSubject具体主题角色
    也叫做被委托角色、被代理角色。它才是冤大头,是业务逻辑的具体执行者。
  • Proxy代理主题角色
    也叫做委托类、代理类。它负责对真实角色的应用,把所有抽象主题类定义的方法限制委托给真实主题角色实现,并且在真实主题角色处理完毕前后做预处理和善后处理工作。

具体的源码
抽象主题类
在这里插入图片描述
真实主题类
设计模式之代理模式_第2张图片
代理类
设计模式之代理模式_第3张图片
代理的构造函数
在这里插入图片描述
你要代理谁就产生该代理的实例,然后把被代理者传递进来,该模式在实际的项目应用中比较广泛。

二.例子

大家都玩过游戏吧,我们就用玩游戏的过程,作为例子,来进一步讲解代理模式究竟是什么样子的.
首先我们先定义游戏过程的类图
设计模式之代理模式_第4张图片
游戏者接口
非常简单,定义了三个方法,分别是我们在网络游戏中最常用的功能:登录游戏、杀怪和升级.
设计模式之代理模式_第5张图片
游戏者实现类
设计模式之代理模式_第6张图片

场景类
在实现类中通过构造函数传递进来玩家姓名,方便进行后期的调试工作。我们通过一个场景类来模拟这样的游戏过程,代码如下:
设计模式之代理模式_第7张图片
运行结果
设计模式之代理模式_第8张图片

运行结果也是我们想要的,记录我这段时间的网游生涯。心理学家告诉我们,人类对于苦难的记忆比对喜悦的记忆要深刻,但是人类对于喜悦是“趋利”性的,每个人都想Happy,都不想让苦难靠近,要想获得幸福,苦难也是再所难免的,我们的网游生涯也是如此。游戏打时间长了,腰酸背痛、眼睛干涩、手臂酸麻,等等,也就是网络成瘾综合症都出来了。其结果就类似吃了那个“一日丧命散”,“筋脉逆流,胡思乱想,而致走火入魔”。那怎么办呢?我们想玩游戏,但又不想碰触到游戏中的烦恼,如何解决呢?有办法,现在游戏代练的公司非常多我把自己的账号交给代练人员,由他们去帮我升级,去打怪,非常好的想法,我们来修改一下类图,如图所示
设计模式之代理模式_第9张图片
代练者
设计模式之代理模式_第10张图片

改进后的场景类
设计模式之代理模式_第11张图片

运行结果
还是张三在打野怪
设计模式之代理模式_第12张图片
是的,没有任何改变,但是你有没有发觉,你的游戏已经在升级,有人在帮你干活了!终于升级到120级,基本上在本服务区,除了GM外,这个你可惹不起!这就是代理模式。;

三. 结论

优点

  • 职责清晰
    真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件事务,附带的结果就是编程简洁清晰。
  • 高扩展性
    具体主题角色是随时都会发生变化的,只要它实现了接口,甭管它如何变化,都逃不脱如
    来佛的手掌(接口),那我们的代理类完全就可以在不做任何修改的情况下使用。
  • 智能化
    这在我们以上的讲解中还没有体现出来,不过在我们以下的动态代理章节中你就会看到代理的智能化有兴趣的读者也可以看看Struts是如何把表单元素映射到对象上的。

你可能感兴趣的:(设计模式,代理模式,设计模式,java)