我们在使命召唤、暗黑破坏神等游戏时,总会接到各种各样的游戏任务,如到某某地方解救某人,或者消灭某某地方的敌人等。当玩家进入到某一个地图(以下称之为游戏场景)时,我们就可以查看它的任务提示。在这个机制下,我们认为,所有的游戏场景都继承于一个类(如HelpHandler),这个类包含一个显示任务提示的方法(如showHelp)。问题在于,任务的提示是有“上下文联系的”,任务的提示是和你的“场景是如何移动的”有关。例如,场景A中没有任务提示,场景B中没有任务提示,场景C、D中分别有任务提示MessageC和MessageD,如果我们从C->B->A移动,那么我们查看的任务提示就是MessageC,如果我们从D->B->A,那么任务提示就是MessageD。我们可以这样来设计:A、B、C、D这4个场景都继承于同一个类(如HelpHandler),因此它们都有显示任务提示的showHelp方法。它们内部有对另外的一个HelpHandler对象的引用,我们称之为候选者,如果自身无法处理任务提示,则调用候选者的showHelp方法。如果看到这里不大明白,就请看下图、示例和我下面的解释:

以上就是我刚刚谈到的职责链模式。它的意图是使得对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。用直白一点的话说就是,如果我可以处理这个请求则处理之,如果不能处理,则让我的候选者来处理。

以下是职责链模式的Java示例代码:

interface Helpful {

void help();

}

abstract class HelpHandler {

HelpHandler successor;

Helpful help;

public HelpHandler(){}

public void setHandler(HelpHandler parent, Helpful help){

this.successor = parent;

this.help = help;

}

public void showHelp(){

if (hasHelp()){

help.help();

} else {

if (successor != null) successor.showHelp();

}

}

private boolean hasHelp(){

return help != null;

}

}

class World extends HelpHandler {

public World(HelpHandler parent) {

Helpful help = new Helpful (){

public void help() {

System.out.println("大地图任务: 请按W、S、A、D来移动。");

}

};

setHandler(parent, help);

}

}

class House extends HelpHandler {

public House(HelpHandler parent) {

Helpful help = new Helpful (){

public void help() {

System.out.println("房间任务: 请拿起房间的武器出门。");

}

};

setHandler(parent, help);

}

}

class Cave extends HelpHandler {

public Cave(HelpHandler parent) {

Helpful help = new Helpful (){

public void help() {

System.out.println("洞穴任务: 请消灭洞穴中的所有怪兽。");

}

};

setHandler(parent, help);

}

}

class Island extends HelpHandler {

public Island(HelpHandler parent) {

setHandler(parent, null);

}

}

public class Responsibility {

public static void main(String[] args) {

World world = new World(null);

House house = new House(world);

Cave cave = new Cave(world);

Island island = new Island(world);

Island islandWithCave = new Island(cave);

world.showHelp();

house.showHelp();

cave.showHelp();

island.showHelp();

islandWithCave.showHelp();

}

}

简要分析上面的代码。上述代码是模拟在游戏的不同场景下显示任务提示。所有的场景都继承于HelpHandler类,HelpHandler类中有个HelpHandler类型的引用successor,表示处理方法的候选者。我们看看HelpHandler中的showHelp方法,它首先判断本类是否能够显示任务提示(即hasHelp是否返回true),如果可以显示则显示之,不能显示,则调用候选者的showHelp方法。通过这种方法,可以使HelpHandler类连成“链状”。

值得注意的是,我们需要在HelpHandler派生类中构造一个匿名类,这个匿名类继承于Helpful接口,这个是显示任务提示的一个接口。在不同的派生类中,我们构造不同的Helpful接口的对象来实现显示不同的任务提示,这其实是一种策略(Strategy)模式(以后会提到)。

再看看main方法,我们定义的World、House、Cave类都有自己的任务提示,而Island类没有,所以它的任务提示取决于它的候选者,因此,island的任务提示就是其候选者world的任务提示,islandWithCave的任务提示就是其候选者cave的任务提示,因此程序的结果为:

大地图任务: 请按W、S、A、D来移动。

房间任务: 请拿起房间的武器出门。

洞穴任务: 请消灭洞穴中的所有怪兽。

大地图任务: 请按W、S、A、D来移动。

洞穴任务: 请消灭洞穴中的所有怪兽。

职责链的有点是降低了发送请求者和接受请求者的耦合度,增强了指派职责的灵活性,它只需要指定一个候选者即可实现职责的指派。然而,它的缺点是,无法保证指派的职责一定能被接收,由于含有递归思想,这个模式会有一定的性能损耗,如果不注意可能会陷入循环调用之中。

java使命召唤_Java设计模式之从[使命召唤等游戏的任务提示]分析职责链(Chain Of Responsibility)模式...相关推荐

  1. 设计模式学习笔记——责任链(Chain of Responsibility)模式

    设计模式学习笔记--责任链(Chain of Responsibility)模式 @(设计模式)[设计模式, 责任链模式, chain of responsibility] 设计模式学习笔记责任链Ch ...

  2. java工厂方法_Java设计模式之工厂方法模式

    2.工厂方法模式 <设计模式之禅>中用神话故事女娲造人来比概述工厂方法模式. 女娲采集黄土捏成人的形状,然后放到八卦炉中烧制,最后放置到大地上生长,工艺过程是没有错的,但是意外随时都会发生 ...

  3. java外观设计修改_Java设计模式之外观模式和装饰器模式的设计(精选)

    前言 本篇来学习下结构型模式的外观模式和装饰器模式. 外观模式 简介 外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接 ...

  4. java 对象工厂_Java设计模式之--工厂方式

    在分析工厂模式之前,我们先看看普通模式下的Java三层结构. Controller(表现层)-Service(业务层)-Dao(持久层.数据库连接层),基于此三层结构完成JavaWeb相关业务. 假设 ...

  5. java 影子实例_java设计模式(四)--单例模式

    Singleton最熟悉不过了,下面学习单例模式.转载:http://zz563143188.iteye.com/blog/1847029 单例对象(Singleton)是一种常用的设计模式.在Jav ...

  6. 设计模式java装饰模式范例_Java设计模式之装饰模式详解

    装饰者模式是动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的替代方案. 假设我们有一个需求,是给一家饮料店做一个计算各种饮料价格的功能.听起来很简单,我们创建一个抽象父类Bever ...

  7. java 防止反射_Java设计模式(一):单例模式,防止反射和反序列化漏洞

    一.懒汉式单例模式,解决反射和反序列化漏洞 package com.iter.devbox.singleton; import java.io.ObjectStreamException; impor ...

  8. java输出不同颜色_Java设计模式-策略模式、状态模式

    推荐阅读: 一只Tom猫:都是"Redis惹的祸",害我差点挂在美团三面,真是"虚惊一场"! java喵:6大面试技能树:JAVA基础+JVM+算法+数据库+计 ...

  9. 格力电器Java面试题_JAVA设计模式学习--工厂模式

    今天谈一下对工厂模式学习的总结. 看完视频和文章之后要自己表述工厂模式,总是感觉无从说起,不知道怎么去定义工厂模式,反复看了几遍之后终于理解一点. 自己理解工厂模式是通过这两种模式的特点来理解和定义的 ...

最新文章

  1. 如何解决企业邮件对国外的通信问题
  2. 【 FPGA 】Vivado中常用的5个Tcl命令
  3. 质量故事(3)---袋鼠与笼子
  4. 深度学习之---yolo源代码部分分析
  5. 自动化运维python学习笔记一
  6. 汇编语言 王爽 第四版 实验4
  7. 什么是句柄什么是句柄对象
  8. 普中科技51单片机开发板
  9. 论文笔记——Contextual Multi-armed Bandit Algorithm for Semiparametric(半参数) Reward Model
  10. lua 随机数 math.random()和math.randomseed()用法
  11. Spark中Map和Json字符串相互转换
  12. 台灯的品质,决定了你的阅读质量
  13. 《MSSQL2008技术内幕:T-SQL语言基础》读书笔记(上)
  14. 统计学上的P值的含义通俗
  15. oracle dbms_metadata,DBMS_METADATA报错解决方法
  16. JS返回上一页-JS返回下一页-JS页面跳转
  17. tikz包 安装_LaTeX—Tikz 宏包入门使用教程
  18. [刷题]leetcode\278_第一个错误的版本
  19. 做城市规划设计,如何下载地形图?
  20. vue 八大生命周期

热门文章

  1. android7.1.1彩蛋魅族,Android 10首个Flyme内测版来了!加入强制开启90Hz彩蛋
  2. 无线传感器网络思维导图
  3. 【图像笔记】深度图像和深度相机
  4. Linux网络编程小项目sqlite,嵌入式数据库sqlite
  5. 海量数据存储之Key-Value存储简介
  6. Windows系统端口被占用解决方法
  7. Android模拟器或者真机无法连接内网的解决方案(当需要修改hosts的时候)
  8. vlookup 2张表 显示na_12个最新Vlookup函数示例大全,再不收藏就是你的错了!
  9. 如何设置谷歌打开后自动全屏(即F11状态全屏)
  10. eclipse+php+wamp配置