声明:迁移自本人CSDN博客https://blog.csdn.net/u013365635

责任链模式,和普通的函数逐层调用栈形成的逻辑链条不通,责任链会落实到某一个具体实施者完成该责任,而普通函数调用栈则是各个被调用函数环环相扣的。记住这点区别可以对责任链模式记忆清晰。
举个例子,程序员应该编写有实际价值的代码,程序员知识一个有用的程序产生的过程链条上的一环。从市场人员接订单、架构师设计系统、程序员编码、测试人员测试,这就是一个典型的责任链。
责任链接口

package com.designpattern.chainofresponsibility;

public interface Chain  {
void addChain(Chain c);
void sendToNextChain(String mesg);
}

市场人员,负责从市场接订单

package com.designpattern.chainofresponsibility;

/**
* 市场人员,获得订到
*/
public class Marketer implements Chain {
private Chain nextChain = null;
private String responsibility = "Get A Order"; public void addChain(Chain c) {
nextChain = c;
} public void sendToNextChain(String msg) {
if(msg.equals(responsibility)) {
System.out.println("A Marketer:Get A Order");
} else {
if(nextChain != null) {
nextChain.sendToNextChain(msg);
}
}
}
}

架构师,负责设计系统

package com.designpattern.chainofresponsibility;

/**
* 架构师,设计系统
*/
public class Architect implements Chain {
private Chain nextChain = null;
private String responsibility = "Design"; public void addChain(Chain c) {
nextChain = c;
} public void sendToNextChain(String msg) {
if(msg.equals(responsibility)) {
System.out.println("A Architect: Design");
} else {
if(nextChain != null) {
nextChain.sendToNextChain(msg);
}
}
}
}

程序员,负责程序开发

    package com.designpattern.chainofresponsibility;

    /**
* 程序员,编码
*/
public class Programmer implements Chain {
private Chain nextChain = null;
private String responsibility = "Coding"; public void addChain(Chain c) {
nextChain = c;
} public void sendToNextChain(String msg) {
if(msg.equals(responsibility)) {
System.out.println("A Programmer: Coding");
} else {
if(nextChain != null) {
nextChain.sendToNextChain(msg);
}
}
}
}

测试人员,负责测试开发出的系统

package com.designpattern.chainofresponsibility;
/**
* 测试人员,测试程序及系统
*/
public class Tester implements Chain {
private Chain nextChain = null;
private String responsibility = "Test"; public void addChain(Chain c) {
nextChain = c;
} public void sendToNextChain(String msg) {
if(msg.equals(responsibility)) {
System.out.println("A Tester: Test");
} else {
if(nextChain != null) {
nextChain.sendToNextChain(msg);
}
}
}
}

其他人,提供各种其他服务

package com.designpattern.chainofresponsibility;

/**
* 其他人员,提供其他服务
*/
public class Others implements Chain {
private Chain nextChain = null;
private String responsibility = ""; public void addChain(Chain c) {
nextChain = c;
} public void sendToNextChain(String msg) {
System.out.println("supply service:" + msg);
}
}

程序运行结果如下。

A Marketer:Get A Order
A Architect: Design
A Programmer: Coding
A Tester: Test
supply service:Other Service

设计模式讲解3:ChainOfResponsibility模式源码的更多相关文章

  1. 并发编程学习笔记(9)----AQS的共享模式源码分析及CountDownLatch使用及原理

    1. AQS共享模式 前面已经说过了AQS的原理及独享模式的源码分析,今天就来学习共享模式下的AQS的几个接口的源码. 首先还是从顶级接口acquireShared()方法入手: public fin ...

  2. 设计模式讲解4:Bridge模式源码

    声明:迁移自本人CSDN博客https://blog.csdn.net/u013365635 桥接模式可以和排列组合关联起来理解,一个对象有多种不通种类的属性,如attributeA1,attribu ...

  3. 设计模式课程 设计模式精讲 7-3 建造者模式源码解析(jdk+guava+spring+mybaties)

    1 源码解析 1.1 jdk解析 1.2 guava解析 1.3 spring解析 1.4 mybaties解析 1 源码解析 1.1 jdk解析 String public StringBuilde ...

  4. 设计模式-简单工厂Coding+jdk源码解析

    感谢慕课geely老师的设计模式课程,本套设计模式的所有内容均以课程为参考. 前面的软件设计七大原则,目前只有理论这块,因为最近参与项目重构,暂时没有时间把Coding的代码按照设计思路一点点写出来. ...

  5. 【一起学源码-微服务】Nexflix Eureka 源码十二:EurekaServer集群模式源码分析

    前言 前情回顾 上一讲看了Eureka 注册中心的自我保护机制,以及里面提到的bug问题. 哈哈 转眼间都2020年了,这个系列的文章从12.17 一直写到现在,也是不容易哈,每天持续不断学习,输出博 ...

  6. 1个月连载30个设计模式真实案例(附源码),挑战年薪60W不是梦

    本文所有内容均节选自<设计模式就该这样学> 本文自2012年10月29日起持续连载,请大家持续关注.... 序言 Design Patterns: Elements of Reusable ...

  7. ACE - Reactor模式源码剖析及具体实现(大量源码慎入)

    原文出自http://www.cnblogs.com/binchen-china,禁止转载. 在之前的文章中提到过Reactor模式和Preactor模式,现在利用ACE的Reactor来实现一个基于 ...

  8. Android Doze模式源码分析

    科技的仿生学无处不在,给予我们启发.为了延长电池是使用寿命,google从蛇的冬眠中得到体会,那就是在某种情况下也让手机进入类冬眠的情况,从而引入了今天的主题,Doze模式,Doze中文是打盹儿,打盹 ...

  9. Flink源码阅读(一)——Flink on Yarn的Per-job模式源码简析

    一.前言 个人感觉学习Flink其实最不应该错过的博文是Flink社区的博文系列,里面的文章是不会让人失望的.强烈安利:https://ververica.cn/developers-resource ...

随机推荐

  1. docker centos 镜像中安装python36详解!生成centos+python36的基础镜像

    获取centos镜像docker pull centos:7.4.1708 启动并进入centos的容器docker run -i –t centos /bin/bash下载安装python编译环境依 ...

  2. C++用sqlite3_open连接打开指定数据库的小问题

    一开始我也纳闷,我以为是我数据库没弄好,但是当我仔细检查,才发现 原来我少了分号 写少了分号,可能会导致  database    和  table    找不到... 所以用的时候需要注意... 代 ...

  3. C++ 检测物理内存以及磁盘空间

    BOOL CheckResource() { MEMORYSTATUSEX statex; statex.dwLength = sizeof (statex); GlobalMemoryStatusE ...

  4. 在 CentOS 中部署 KMS 服务器(vlmcsd)

    准备 vlmcsd 下载 vlmcsd 本文使用的 vlmcsd 版本为 svn1111,支持的产品: Windows Vista – 10Windows Server 2008 - 2016Offi ...

  5. 一、JavaScript之第一个实例,点击按钮修改文本内容

    一.代码如下: 二.运行后效果如下 三.点击按钮,"曾经沧海难为水"变成了日期事件了 <!DOCTYPE html> <html> <meta htt ...

  6. 125-PHP类__set()魔术方法

    <?php class ren{ //定义一个人类 //定义成员属性 private $name='tom'; private $age=15; //定义__set()魔术方法 public f ...

  7. 078-PHP数组排序,两次循环法

    <?php $arr=array(35,43,56,2,76,23,47,55,71); //定义一个数组 echo '数组排序之前的信息:<br />'; print_r($arr ...

  8. eclipse中svn重新设置账户

    查看svn版本:windows > preference > Team > SVN 1.如果svn插件是svnkit版 只需找到.keyring文件,一般目录是:eclipse安装目 ...

  9. Apache部署Django+Vue

    首先部署Vue,后端项目django开5000端口,所以vue里的路由是ip:5000,然后打包npm run build 生成dist文件 把dist文件里的index.html和static放在/ ...

  10. 前端第四篇---前端基础之jQuery

    前端第四篇---前端基础之jQuery 一.jQuery介绍 二.jQuery对象 三.jQuery基础语法 四.事件 五.动画效果 六.补充each 一.jQuery简介 1.jQuery介绍 jQ ...