设计模式讲解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 ...
随机推荐
- oracle,uuid为主键,插入时直接更新id
uuid为主键,插入时自动更新 -- Create table create table TECHNOLOGYCOMPANY ( ID VARCHAR2(32) default SYS_GUID() ...
- jmeter非GUI模式命令
一.如果没有.jtl文件,运行如下命令: jmeter -n -t baidu.jmx -l result.jtl 以非GUI形式运行Jmeter脚本jmeter -n -t baidu.jmx -l ...
- asp.net数据库增删改查demo
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- 关于连接查询主要是左右连接查询中,where和on的区别
工作中,今天用到左连接查询,我自己造的数据,需要根据条件进行筛选,但是筛选不符合我的要求,最终发现是左右连接中where和on的区别,在作怪,工作中用的表关联太多,我下面简化要点,仅仅把注意点写个简单 ...
- node - TypeError: argument handler must be a function 路由报错的原因
原因 : 路由一定要暴露给外部使用 var express = require('express') var router = express.Router() router.get('/', ...
- git仓库拆分
例如: # 这就是那个大仓库 big-project $ git clone git@github.com:tom/big-project.git $ cd big-project # 把所有 `co ...
- [LeetCode] 927. Three Equal Parts 三个相等的部分
Given an array A of 0s and 1s, divide the array into 3 non-empty parts such that all of these parts ...
- Wdcp升级Php5.3成功
在lanmp/wdcp/wdOS的当前版本中,默认的php都是用到5.2.17的版本如需要升级到php5.3的,可使用如下脚本升级(注:此升级无安全漏洞等原因,只为某些追求高版本或应用需求需要高版本, ...
- Flink 笔记(一)
简介 Flink是一个低延迟.高吞吐.统一的大数据计算引擎, Flink的计算平台可以实现毫秒级的延迟情况下,每秒钟处理上亿次的消息或者事件. 同时Flink提供了一个Exactly-once的一致性 ...
- Bean 注解(Annotation)配置(2)- Bean作用域与生命周期回调方法配置
Spring 系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of ...