责任链模式-Chain of Responsibility

在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。

咱们在这里换一个场景:

国王(King类), 经常会遇到各种麻烦(Trouble类), 而国王一旦遇到麻烦, 则会把麻烦交给手下去做.

国王有一天上了战场, 任务法派的顺序是这样的, 骑兵先上, 骑兵不行步兵上, 步兵不行就换贴身侍卫上.

TroubleType枚举

在这里枚举了, 国王在战场上有三种事情会分派给手下去做

public enum TroubleType {
DEFEND, ATTACK, PROTECT
}  

Trouble类

这里是国王分配的事情

public class Trouble {
private final TroubleType troubleType;
private final String requestDescription; public Trouble(final TroubleType troubleType, final String requestDescription) {
this.troubleType = Objects.requireNonNull(troubleType);
this.requestDescription = Objects.requireNonNull(requestDescription);
} public String getRequestDescription() {
return requestDescription;
} public TroubleType getRequestType() {
return troubleType;
} @Override
public String toString() {
return getRequestDescription();
}
}

Support抽象类

国王的手下解决Trouble都会实现这个Support借口, Support借口是解决Trouble的统一定义

public abstract class Support {

    private Support next;

    public Support(Support next) {
this.next = next;
} public void handleRequest(Trouble trouble) {
if (next != null) {
next.handleRequest(trouble);
}
} protected void printHandling(Trouble trouble) {
System.out.printf("%s 执行任务: %s\n", this, trouble);
} @Override
public abstract String toString();
}

RiderSupport类

骑兵在本例子中只负责进攻

public class RiderSupport extends Support {

    public RiderSupport(Support support) {
super(support);
} @Override
public void handleRequest(Trouble trouble) {
if (trouble.getRequestType().equals(TroubleType.ATTACK)) {
printHandling(trouble);
} else {
super.handleRequest(trouble);
}
} @Override
public String toString() {
return "Rider";
} }

SolderSupport类

步兵在本例子中只负责防守

public class SolderSupport extends Support {

    public SolderSupport(Support support) {
super(support);
} @Override
public void handleRequest(Trouble trouble) {
if (trouble.getRequestType().equals(TroubleType.DEFEND)) {
printHandling(trouble);
} else {
super.handleRequest(trouble);
}
} @Override
public String toString() {
return "Soldier";
}
}

GuardSupport类

本类负责保卫国王

public class GuardSupport extends Support {
public GuardSupport(Support next) {
super(next);
} @Override
public void handleRequest(Trouble trouble) {
if (trouble.getRequestType().equals(TroubleType.PROTECT)) {
printHandling(trouble);
} else {
super.handleRequest(trouble);
}
} @Override
public String toString() {
return "Guard";
}
}

King类

本类负责维护责任链.

public class King {
private Support chain; public King() {
buildChain();
} private void buildChain() {
chain = new RiderSupport(new SolderSupport(new GuardSupport(null)));
} public void resolve(Trouble trouble) {
chain.handleRequest(trouble);
}
}

Main

运行测试

public class Main {
public static void main(String[] args) {
King king = new King();
king.resolve(new Trouble(TroubleType.DEFEND, "防御"));
king.resolve(new Trouble(TroubleType.ATTACK, "进攻"));
king.resolve(new Trouble(TroubleType.PROTECT, "保护国王"));
}
}

  

责任链模式-Chain of Responsibility(Java实现), 例2的更多相关文章

  1. 责任链模式-Chain of Responsibility(Java实现), 例1

    责任链模式-Chain of Responsibility, 例1 在这种模式中,通常每个接收者都包含对另一个接收者的引用.如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推. ...

  2. 二十四种设计模式:责任链模式(Chain of Responsibility Pattern)

    责任链模式(Chain of Responsibility Pattern) 介绍为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求.将这些对象连成一条链,并沿着这条链传递该请求,直 ...

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

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

  4. 《JAVA设计模式》之责任链模式(Chain of Responsibility)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...

  5. 责任链模式/chain of responsibility/行为型模式

    职责链模式 chain of responsibility 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处 ...

  6. 23种设计模式--责任链模式-Chain of Responsibility Pattern

    一.责任链模式的介绍 责任链模式用简单点的话来说,将责任一步一步传下去,这就是责任,想到这个我们可以相当击鼓传花,这个是为了方便记忆,另外就是我们在项目中经常用到的审批流程等这一类的场景时我们就可以考 ...

  7. 责任链模式-Chain of Responsibility

    责任链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 责任链模式结构图: 代码实现: 责任链模式 ...

  8. 设计模式之二十:责任链模式(Chain of Responsibility)

    感觉这个设计模式和组合模式一样是一种非常巧妙的设计模式,在须要使用它的地方假设不使用这样的设计模式代码会变的非常复杂,可是这样的设计模式的基本原理又是非常easy的. 责任链模式: 通过使多个对象都有 ...

  9. 责任链模式(Chain of Responsibility、Handler)(请求处理建立链)

    (使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止.) 从名字中看出 ,系统中将会存在多个有类似处理能力的对 ...

随机推荐

  1. mssql sqlserver with cte表达式(递归)找出最顶值的方法分享

    摘要: 下文通过递归的方式找出最顶级部门的方法分享,如下所示: 实验环境:sql server 2008 R2 下文通过cte-with表达式实现递归,获取一个公司的顶级部门,如下所示 例:部门表 c ...

  2. 从0开始的Python学习016异常

    简介 当你的程序不能正常运行的时候,Python会在控制台打印一段提醒,告诉你一个错误,这个错误就是异常. 错误 我在控制台写了一段无效的代码,将print()的括号去掉,在执行这条语句的时候,系统提 ...

  3. java连接sql server数据库(使用用户sa)

    一.安装数据库相关软件 sql server management studio是管理sql server数据库的软件,想要使用需到微软官网下载安装sql server,然后再安装sql server ...

  4. 探索SQL Server元数据(一)

    简介 在数据库中,我们除了存储数据外,还存储了大量的元数据.它们主要的作用就是描述数据库怎么建立.配置.以及各种对象的属性等.本篇简单介绍如何使用和查询元数据,如何更有效的管理SQLServer 数据 ...

  5. RubyGems系列之创建自己的gem

    转载请注明来源:https://www.cnblogs.com/zhanggui/p/9720818.html 一. 前言 我们可以在rubygems.org中下载安装他人创建的gem.现在,我们尝试 ...

  6. 如何在element-UI 组件的change事件中传递自定义参数

    以select为例,如果select写在循环里,触发change事件时可能不只需要传递被选中项的值,还要传递index过去,来改变同一循环中的其他标签的状态. 下面这样写是无效的: @change=& ...

  7. 【js】字符串方法

    let str = 'na'; console.log(str.repeat('3'));//nanana console.log(str.startsWith('n'));//true consol ...

  8. python 中 try catch finally语句中含有return语句的执行情况

    无论是在try还是在except中,遇到return时,只要设定了finally语句,就会中断当前的return语句,跳转到finally中执行,如果finally中遇到return语句,就直接返回, ...

  9. Alpha阶段事后分析

    设想和目标 我们在Alpha阶段对网站的定位布局一直在摸索,网站所有功能和网站所能解决的需求痛点并不是在前几次会议就定死了的.Alpha阶段整个过程中我们团队靠着频繁的scrum会议和微信群交(shu ...

  10. ABP之什么是ABP(ASP.NET Boilerplate)

    1.介绍 ABP是开源的且文档比较齐全的应用程序框架.其实它不仅仅是个框架,考虑其最佳实践,ABP更提供了基于领域驱动设计(DDD)的强大价格模型. ABP支持最新的ASP.NET Core和EF C ...