设计模式----代理模式(一)

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

设计模式----代理模式(一)_第1张图片

  • 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");
    }
}

运行结果

设计模式----代理模式(一)_第2张图片


当我们长时间沉迷网络游戏,对我们身心健康都不利,所以这时候如果还想让自己的账号变强,可以把账号交给代练人员,由他们帮助我们打怪升级账号,我们修改一下之前的类图

设计模式----代理模式(一)_第3张图片

在类图中增加了一个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");
    }
}

运行结果

设计模式----代理模式(一)_第4张图片


代理模式

定义

Provide a surrogate or placeholder for another object to control access to it.(为其他对象提供一种代理以控制对这个对象的访问。 )

代理模式的通用类图

设计模式----代理模式(一)_第5张图片

我们先看一下类图中的三个角色的定义:

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

代理模式的应用

优点

  • 职责清晰
  • 高扩展性
  • 智能化

使用场景

想想现实世界吧, 打官司为什么要找个律师? 因为你不想参与中间过程的是是非非, 只要完成自己的答辩
就成, 其他的比如事前调查、 事后追查都由律师来搞定, 这就是为了减轻你的负担。 代理模式的使用场景非常多, 大家可以看看Spring AOP, 这是一个非常典型的动态代理 。


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

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