当玩某些网络游戏时,需要我们一直打怪获得经验和其它收益来升级使让我们变强,我们把打游戏的过程用类图表示

  • 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, 这是一个非常典型的动态代理 。


参考书籍:《设计模式之禅》