当玩某些网络游戏时,需要我们一直打怪获得经验和其它收益来升级使让我们变强,我们把打游戏的过程用类图表示
- 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,这是一个非常典型的动态代理。
参考书籍:《设计模式之禅》