设计模式讲解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 ...
随机推荐
- 吴裕雄--天生自然java开发常用类库学习笔记:比较器
class Student implements Comparable<Student> { // 指定类型为Student private String name ; private i ...
- postgres http fdw + plv8 处理数据
原理很简单就是就有http fdw 获取数据,然后结合plv8 处理json 数据 环境准备 docker-compose 文件 version: "3" services: p ...
- mybatis关于级联查询结果集嵌套映射对象非列表的处理问题
工作中遇到这么一个问题,嵌套查询,返回json的时候,作为属性,deviceFields是一个device中的一个对象属性,在json返回的时候想要得到的应该是deviceFields:{ 具体属性} ...
- JS 三大难点
1,作用域链 2,原型链 3,闭包
- vuejs+thinkphp5+phpsocketIO+timer数据及时更新
1.安装thinkphp5.0以上版本包含workerman框架2.composer安装composer require workerman/phpsocket.io3.vue中调用需要加载weapp ...
- spring mvc绑定参数之日期类型转换
问题复现步骤: 1.提交表单,参数为: 2.接收参数类型为product实体类,如下 3.错误日志如下: org.springframework.validation.BindException: o ...
- 3分钟学会Python 针对Excel操作
1.python 读取Excel # -*- coding: utf-8 -*- import xlrd import os,sys reload(sys) sys.setdefaultencodin ...
- 吴裕雄--天生自然C++语言学习笔记:C++ 接口(抽象类)
接口描述了类的行为和功能,而不需要完成类的特定实现. C++ 接口是使用抽象类来实现的,抽象类与数据抽象互不混淆,数据抽象是一个把实现细节与相关的数据分离开的概念. 如果类中至少有一个函数被声明为纯虚 ...
- springboot - 映射 HTTP Response Status Codes 到自定义 JSP Error 页面
1.总览 2.代码 1).pom.xml <dependencies> <dependency> <groupId>org.springframework.boot ...
- 实验3- 熟悉常用的 HBase 操作
石家庄铁道大学信息科学与技术学院 实验报告 2018年----2019年 第一学期 题目: 熟悉常用的 HBase ...