设计模式代理模式一

8次阅读

共计 2389 个字符,预计需要花费 6 分钟才能阅读完成。

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

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


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

正文完
 0