当玩某些网络游戏时,需要我们一直打怪获得经验和其它收益来升级使让我们变强,我们把打游戏的过程用类图表示
- IGame Player:所有网络游戏的玩家
- Game Player:实现每个游戏爱好者为了玩游戏要执行的功能
游戏者接口
定义了三个方法, 分别是我们在网络游戏中最常用的功能: 登录游戏、 杀怪和升级
public interface IGamePlayer { //登录游戏 public void login(String user, String password); //杀怪, 网络游戏的主要特色 public void killBoss(); //升级 public void upgrade();}
游戏者实现类
public class GamePlayer implements IGamePlayer { private String name = ""; //通过构造函数传递名称 public GamePlayer(String _name) { this.name = _name; } //打怪, 最期望的就是杀老怪 public void killBoss() { System.out.println(this.name + "在打怪! "); } //进游戏之前你肯定要登录吧, 这是一个必要条件 public void login(String user, String password) { System.out.println("登录名为" + user + "的用户" + this.name + "登录成功! "); } //升级, 升级有很多方法, 花钱买是一种, 做任务也是一种 public void upgrade() { System.out.println(this.name + " 又升了一级! "); }}
Client场景类
public class Client { public static void main(String[] args) { //定义一个痴迷的玩家 IGamePlayer player = new GamePlayer("张三"); //开始打游戏, 记下时间戳 System.out.println("开始时间是: 2009-8-25 10:45"); player.login("zs", "password"); //开始杀怪 player.killBoss(); //升级 player.upgrade(); //记录结束游戏时间 System.out.println("结束时间是: 2009-8-26 03:40"); }}
运行结果
当我们长时间沉迷网络游戏,对我们身心健康都不利,所以这时候如果还想让自己的账号变强,可以把账号交给代练人员,由他们帮助我们打怪升级账号,我们修改一下之前的类图
在类图中增加了一个GamePlayerProxy类来代表游戏代练者, 它也不能有作弊的方法呀,游戏代练者也是手动打怪呀, 因此同样继承IGamePlayer接口
代练人员实现
首先通过构造函数说明要代谁打怪升级, 然后通过手动开始代用户打怪、 升级
public class GamePlayerProxy implements IGamePlayer { private IGamePlayer gamePlayer = null; //通过构造函数传递要对谁进行代练 public GamePlayerProxy(IGamePlayer _gamePlayer) { this.gamePlayer = _gamePlayer; } //代练杀怪 public void killBoss() { this.gamePlayer.killBoss(); } //代练登录 public void login(String user, String password) { this.gamePlayer.login(user, password); } //代练升级 public void upgrade() { this.gamePlayer.upgrade(); }}
改进后的场景类
public class Client { public static void main(String[] args) { //定义一个痴迷的玩家 IGamePlayer player = new GamePlayer("张三"); //然后再定义一个代练者 IGamePlayer proxy = new GamePlayerProxy(player); //开始打游戏, 记下时间戳 System.out.println("开始时间是: 2009-8-25 10:45"); proxy.login("zs", "password"); //开始杀怪 proxy.killBoss(); //升级 proxy.upgrade(); //记录结束游戏时间 System.out.println("结束时间是: 2009-8-26 03:40"); }}
运行结果
代理模式
定义
Provide a surrogate or placeholder for another object to control access to it.(为其他对象提供一种代理以控制对这个对象的访问。 )
代理模式的通用类图
我们先看一下类图中的三个角色的定义:
- Subject抽象主题角色
抽象主题类可以是抽象类也可以是接口, 是一个最普通的业务类型定义, 无特殊要求。 - RealSubject具体主题角色
也叫做被委托角色、 被代理角色。 它才是冤大头, 是业务逻辑的具体执行者。 - Proxy代理主题角色
也叫做委托类、 代理类。 它负责对真实角色的应用, 把所有抽象主题类定义的方法限制委托给真实主题角色实现, 并且在真实主题角色处理完毕前后做预处理和善后处理工作
代理模式的应用
优点
- 职责清晰
- 高扩展性
- 智能化
使用场景
想想现实世界吧, 打官司为什么要找个律师? 因为你不想参与中间过程的是是非非, 只要完成自己的答辩
就成, 其他的比如事前调查、 事后追查都由律师来搞定, 这就是为了减轻你的负担。 代理模式的使用场景非常多, 大家可以看看Spring AOP, 这是一个非常典型的动态代理 。
参考书籍:《设计模式之禅》