设计模式讲解3:ChainOfResponsibility模式源码
声明:迁移自本人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模式源码的更多相关文章
- 并发编程学习笔记(9)----AQS的共享模式源码分析及CountDownLatch使用及原理
1. AQS共享模式 前面已经说过了AQS的原理及独享模式的源码分析,今天就来学习共享模式下的AQS的几个接口的源码. 首先还是从顶级接口acquireShared()方法入手: public fin ...
- 设计模式讲解4:Bridge模式源码
声明:迁移自本人CSDN博客https://blog.csdn.net/u013365635 桥接模式可以和排列组合关联起来理解,一个对象有多种不通种类的属性,如attributeA1,attribu ...
- 设计模式课程 设计模式精讲 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 ...
- 设计模式-简单工厂Coding+jdk源码解析
感谢慕课geely老师的设计模式课程,本套设计模式的所有内容均以课程为参考. 前面的软件设计七大原则,目前只有理论这块,因为最近参与项目重构,暂时没有时间把Coding的代码按照设计思路一点点写出来. ...
- 【一起学源码-微服务】Nexflix Eureka 源码十二:EurekaServer集群模式源码分析
前言 前情回顾 上一讲看了Eureka 注册中心的自我保护机制,以及里面提到的bug问题. 哈哈 转眼间都2020年了,这个系列的文章从12.17 一直写到现在,也是不容易哈,每天持续不断学习,输出博 ...
- 1个月连载30个设计模式真实案例(附源码),挑战年薪60W不是梦
本文所有内容均节选自<设计模式就该这样学> 本文自2012年10月29日起持续连载,请大家持续关注.... 序言 Design Patterns: Elements of Reusable ...
- ACE - Reactor模式源码剖析及具体实现(大量源码慎入)
原文出自http://www.cnblogs.com/binchen-china,禁止转载. 在之前的文章中提到过Reactor模式和Preactor模式,现在利用ACE的Reactor来实现一个基于 ...
- Android Doze模式源码分析
科技的仿生学无处不在,给予我们启发.为了延长电池是使用寿命,google从蛇的冬眠中得到体会,那就是在某种情况下也让手机进入类冬眠的情况,从而引入了今天的主题,Doze模式,Doze中文是打盹儿,打盹 ...
- Flink源码阅读(一)——Flink on Yarn的Per-job模式源码简析
一.前言 个人感觉学习Flink其实最不应该错过的博文是Flink社区的博文系列,里面的文章是不会让人失望的.强烈安利:https://ververica.cn/developers-resource ...
随机推荐
- PL/SQL 找到某列都为空的列名
DECLARE CURSOR temp IS SELECT COLUMN_NAME FROM ALL_TAB_COLUMNS WHERE TABLE_NAME=Upper('xxx'); v_num ...
- 吴裕雄--天生自然java开发常用类库学习笔记:Math与Random类
public class MathDemo01{ public static void main(String args[]){ // Math类中的方法都是静态方法,直接使用“类.方法名称()”的形 ...
- 一文详解scala泛型及类型限定
今天知识星球球友,微信问浪尖了一个spark源码阅读中的类型限定问题.这个在spark源码很多处出现,所以今天浪尖就整理一下scala类型限定的内容.希望对大家有帮助. scala类型参数要点 1. ...
- SQL server 注入 和 SQL server 扩展(10.29 第二十九天)
Step1:检测注入点 Step2: select * from sysobjects (sysobjects 系统对象表,保存当前数据库的对象) select * from users wher ...
- MongoDB 3.2 升级至 3.4.6
MongoDB 升级测试步骤:1.MongoDB版本升级顺序3.2->3.4->3.6->4.0 不能跨版本升级2.升级到3.4后,您不能降级到3.2.7或更早版本.您只能降级到3. ...
- 017-PHP数组形式读取TXT记事本内容
<?php // 打开文件同时,输出每一行 $myFile = file("data.txt"); for ($index = 0; $index < count($m ...
- cudaThreadSynchronize()
// 调用CUDA kernel 是非阻塞的,调用kernel语句后面的语句不等待kernel执行完,立即执行.所以在 call_kernel(see kernel.cu) 中执行 m5op.dump ...
- 细说 OLAP 与 OLTP
OLAP (Online analytical processing)[联机分析处理] 起源 数据库概念最初源于1962年Kenneth Iverson发表的名为"A Programming ...
- Channel详解
复制自:http://www.cnblogs.com/youngKen/p/4921092.html java.nio.channels.FileChannel封装了一个文件通道和一个FileChan ...
- CGridCtrl添加右键菜单
头文件下添加: afx_msg void OnMergeCell(); afx_msg void OnContextMenu(CWnd* /*pWnd*/, CPoint /*point*/); 添加 ...