嘿嘿,这次介绍一个好玩的设计模式 — — 责任链模式

相关代码下载:

GitHub - GodisGod/DesignPatternStudy: 设计模式学习demo
https://github.com/GodisGod/DesignPatternStudy

所谓责任链,顾名思义就是一个责任的链条,既然是链条那就会有结点。假设我们有ABC三个结点,如果A没法处理就把处理的责任交给B,如果B也没法处理就把处理的责任交给C,依次传递下去。这就是责任链模式啦。

代码示例:

我们有三个海贼:

海贼名 战斗力
路飞 5010
香克斯 11000
罗杰 20000

另外我们有三个敌人:

敌人名 战斗力
多弗朗明哥 5000
四皇凯多 10000
近海之王 15000

战斗力排行:
罗杰>近海之王>香克斯>四皇凯多>多弗朗明哥>路飞

我们的主角是路飞,所以让路飞依次挑战这些敌人:

1、路飞挑战多佛朗明哥,可以战胜,所以不需要交给自己的老大香克斯处理

2、路飞挑战凯多,打不过,所以要交给自己的老大香克斯处理
3、路飞挑战近海之王,打不过,所以要交给自己的老大香克斯处理,香克斯发现自己也打不过近海之王(#^ . ^#)所以要交给自己的老大,海贼王罗杰处理。

那么上面的这种场景用责任链模式该怎么处理呢?

1、首先我们要定义责任链模式每个结点的功能

/*** 海贼*/
public abstract class ThePirate {private ThePirate nextPirate;/*** 设置下一个结点** @param nextPirate*/public void setNextPirate(ThePirate nextPirate) {this.nextPirate = nextPirate;}/*** 处理战斗需求** @param enemy*/public final void fightEnemy(Enemy enemy) {if (fightNum() >= enemy.getFightNum()) {Log.i("LHD", getHeroName() + "战斗力比较强,可以打败" + enemy.getEnemyName());fight(enemy);} else {if (nextPirate == null) {Log.i("LHD", "谁也打不过");//任务没有被处理,这个时候是不纯的责任链return;}Log.i("LHD", getHeroName() + "打不过" + enemy.getEnemyName() + ",那就让" + nextPirate.getHeroName() + "打他");nextPirate.fightEnemy(enemy);}}/*** 具体的战斗过程** @param enemy*/protected abstract void fight(Enemy enemy);/*** 获取英雄的名字** @return*/public abstract String getHeroName();/*** 获取战斗力数值** @return*/public abstract int fightNum();}
关键点在于private ThePirate nextPirate; 这个对象,我们要在每个结点里设置下一个结点的对象。
另外一个关键点是判断当前结点要不要处理这个请求,如果不处理则传给下一个结点。当然也可以没有下一个结点,那么这个结点就是最后一个结点,这个责任链是一个不纯的责任链。

下面是海贼的代码:

/*** 路飞*/
public class Luffy extends ThePirate {@Overridepublic int fightNum() {return 5100;}@Overridepublic void fight(Enemy enemy) {Log.i("LHD", getHeroName() + "打败了" + enemy.getEnemyName());}@Overridepublic String getHeroName() {return "草帽小子路飞";}
}
/*** 罗杰*/
public class Roger extends ThePirate {@Overridepublic int fightNum() {return 20000;}@Overridepublic void fight(Enemy enemy) {Log.i("LHD", getHeroName() + "打败了" + enemy.getEnemyName());}@Overridepublic String getHeroName() {return "海贼王 哥尔·D·罗杰 Gol·D·Roger";}
}
/*** 香克斯*/
public class Shanks extends ThePirate {@Overridepublic int fightNum() {return 11000;}@Overridepublic void fight(Enemy enemy) {Log.i("LHD", getHeroName() + "打败了" + enemy.getEnemyName());}@Overridepublic String getHeroName() {return "四皇 红发香克斯";}
}

下面是敌人的代码:

/*** 敌人*/
public abstract class Enemy {public abstract String getEnemyName();public abstract int getFightNum();}
/*** 多佛朗明哥*/
public class Joker extends Enemy {@Overridepublic String getEnemyName() {return "七武海 多弗朗明哥";}@Overridepublic int getFightNum() {return 5000;}
}
/*** 凯多*/
public class KaiDuo extends Enemy {@Overridepublic String getEnemyName() {return "四皇凯多";}@Overridepublic int getFightNum() {return 10000;}
}
/*** 近海之王*/
public class TheKingOfTheSea extends Enemy {@Overridepublic String getEnemyName() {return "近海之王";}@Overridepublic int getFightNum() {return 15000;}
}

战斗开始:

                //构建三个海贼ThePirate luffy = new Luffy();ThePirate shanks = new Shanks();ThePirate roger = new Roger();//设置关系,路飞的老大是香克斯,香克斯的老大是海贼王罗杰luffy.setNextPirate(shanks);shanks.setNextPirate(roger);//构建三个敌人Enemy joker = new Joker();Enemy kaiDuo = new KaiDuo();Enemy kingOfTheSea = new TheKingOfTheSea();//让路飞去挨个揍敌人Log.i("LHD","路飞的第一个敌人");luffy.fightEnemy(joker);Log.i("LHD","路飞的第二个敌人");luffy.fightEnemy(kaiDuo);Log.i("LHD","路飞的第三个敌人");luffy.fightEnemy(kingOfTheSea);

战斗结果:

可以看到结果如我们所料,通过责任链模式,我们将待处理的任务依次传递下去直到被处理为止。
对于责任链模式的每个结点:
1、处理请求
2、自己没法处理的要将请求传入下一个结点,绝对不允许又将请求传入上一结点。
对于责任链模式,一个请求只有两种结果:
1、请求最终被处理,这种责任链模式称为纯的责任链
2、请求最后未被处理,这种责任链模式称为不纯的责任链
我们在实际应用中所见到的大多都是不纯的责任链。

以上就是责任链模式的简单介绍啦(#^ . ^#)

java常用设计模式7——责任链模式相关推荐

  1. 轻松学习Java设计模式之责任链模式

    我们的态度是:每天进步一点点,理想终会被实现. 前言 设计模式,可能很多人都是看到代码知道怎么回事,但是离开代码再让其说出来,估计就有点含糊其词了,包括我自己在内.Android中其实用到的设计模式也 ...

  2. Java设计模式之责任链模式(二)

    所有设计模式传送门 本文将一起介绍学习下设计模式之责任链模式.责任链模式是指使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有 ...

  3. Java设计模式作业-责任链模式

    Java设计模式作业-责任链模式:Web过滤器 文章目录 前言 一.类图 二.代码及测试结果 1.Trouble类 2.Support类 3.CharSupport类 4.TypeTransformS ...

  4. Java设计模式系列--责任链模式(应用)

    原文网址:Java设计模式系列--责任链模式(应用)_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍Java设计模式中的责任链模式的一些使用场景. 责任链模式的好处 符合单一职责原则 每个功能 ...

  5. JAVA设计模式之责任链模式(职责链模式)

    转自JAVA设计模式之责任链模式(职责链模式)​​​​​​​ 责任链/职责链(Chain of Responsibility)模式的定义 为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理 ...

  6. Java设计模式之责任链模式(简单易懂)

    前言: 责任链模式(Chain of Responsibility): 使多个对象都有机会处理同一请求,从而避免请求的发送者和接受者之间的耦合关系,每个对象都是一个处理节点,将这些对象连成一条链,并沿 ...

  7. 走穿java23种设计模式-15责任链模式详解

    走穿java23种设计模式-15责任链模式详解 责任链模式是一种常见的行为模式. 一.责任链模式的现实场景 习伟过生日邀请了很多朋友到KTV一起庆祝,为了增加欢乐的气氛,习伟建议大家一起玩击鼓传花的游 ...

  8. 软件设计模式之责任链模式实验

    软件设计模式之责任链模式实验 一.实验目的 掌握软件责任链模式中的命令模式,能够用责任链模式编写程序,解决实际问题. 二.实验内容与要求 内容:某小学老师指定班里的三位学生收寒假作业,三位学生分别负责 ...

  9. 乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)

    原文:乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern) [索引页] [源码下载] 乐在其中设计模式(C#) - 责任链模式(Chain of ...

最新文章

  1. 查 101.201.62.30 IP信誉方法
  2. JavaScript学习13 JavaScript中的继承
  3. java 物理内存_聊聊Java中的内存
  4. java launcher 下载_Java Launcher下载并安装
  5. day21 java的随机数
  6. vector的学习(系统的学习)
  7. codeforces 261D Maxim and Increasing Subsequence(树状数组优化最长上升子列)
  8. 关于vuex中actions可以返回promise的用法
  9. 搜索框 UISearchBar的取消按钮改为中文
  10. springboot 多模块项目添加一新模块
  11. 称重管理系统使用说明_车辆智能称重管理系统车牌识别
  12. xml建模包括以下_我们的服务|无人机倾斜摄影三维建模
  13. win7连接网络打印机需要输入网络密码,怎么办
  14. mysql怎样发给别人_怎么把数据库发给别人
  15. java枚举类构造方法默认是,枚举类型的构造方法_Java语言程
  16. 我所理解的高通UEFI之display的流程和移植
  17. 树形结构的数据与一维数组数据的相互转换
  18. hadoop集群的集中管理
  19. Generator函数的理解和使用
  20. JESD204接口调试总结——Xilinx JESD204B IP AXI寄存器简介

热门文章

  1. 宇视网络视频录像机运动检测告警推送到手机客户端
  2. 阿里云服务器CPU有AMD处理器吗?阿里云AMD服务器规格大全
  3. 全球及中国蓝牙和智能音箱行业营销状况及盈利前景预测报告(2022-2027年)
  4. Java后端技术学习体系—韩顺平
  5. python股票数据库_利用Python爬股票数据并存入数据库Mysql
  6. html5音乐播放器设计论文,音乐播放器的设计与实现毕业设计论文
  7. 京东开店要多少钱?需要什么条件?在京东开店后遇到问题怎么办?
  8. postman的常见断言
  9. invalid comparator问题
  10. 智能家居手势识别,只需百度AI即可搞定