定义:

使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连城一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

结构:(书中图,侵删)

一个抽象的处理者
若干个具体处理者(每个具体处理者都不知道它的继任者是谁,这个继任者由客户端决定,只负责把处理不了的请求转发给继任者)

实例:

工作流基本都可以用这个模式来设计。
我就来写个生产酱板鸭的流水线好了。
屠宰-》清洗-》卤制-》风干-》包装
简化一点,懒得写那么多类
清洗-》卤制-》包装

鸭子类:

package designpattern.chainofresponsibility;

public class Duck {
public State state; Duck(State state) {
this.state = state;
} public enum State {
DIRTY, CLEAN, COOKED, PACKAGED
} public State getState() {
return state;
} public void setState(State state) {
this.state = state;
} }

抽象处理者类:

package designpattern.chainofresponsibility;

public abstract class Handler {
protected Handler successor; public void setSuccessor(Handler successor) {
this.successor = successor;
} public abstract void handleDuck(Duck duck);
}

清洗者类(具体处理者):

package designpattern.chainofresponsibility;

import designpattern.chainofresponsibility.Duck.State;

public class DuckCleaner extends Handler {

    @Override
public void handleDuck(Duck duck) {
if (duck.state == State.DIRTY) {
System.out.println("清洗员-》清理鸭子~");
duck.setState(State.CLEAN);
} else {
successor.handleDuck(duck);
}
} }

厨师类(具体处理者):

package designpattern.chainofresponsibility;

import designpattern.chainofresponsibility.Duck.State;

public class DuckCook extends Handler {
@Override
public void handleDuck(Duck duck) {
if (duck.state == State.CLEAN) {
System.out.println("厨师-》卤制鸭子~");
duck.setState(State.COOKED);
} else {
successor.handleDuck(duck);
}
}
}

打包者类(具体处理者):

package designpattern.chainofresponsibility;

import designpattern.chainofresponsibility.Duck.State;

public class DuckPackager extends Handler {
@Override
public void handleDuck(Duck duck) {
if (duck.state == State.COOKED) {
System.out.println("打包员-》包装鸭子~");
duck.setState(State.PACKAGED);
}
}
}

客户端:

package designpattern.chainofresponsibility;

import designpattern.chainofresponsibility.Duck.State;

public class Client {
public static void main(String[] args) {
DuckCleaner duckCleaner = new DuckCleaner();
DuckCook duckCook = new DuckCook();
DuckPackager duckPackager = new DuckPackager();
duckCleaner.setSuccessor(duckCook);
duckCook.setSuccessor(duckPackager); // 处理脏鸭子
Duck duck = new Duck(State.DIRTY);
duckCleaner.handleDuck(duck);
// 处理卤好的鸭子
duck.setState(State.COOKED);
duckCleaner.handleDuck(duck);
}
}

结果输出:

清洗员-》清理鸭子~
打包员-》包装鸭子~
不管鸭子在哪个状态,统统传给清理者,他处理不了,会一路传下去,直到正确的人来处理。

总结:

这个模式算是一个结构比较简单的,也很好理解,只不过之前自己想的时候完全没有想出来可以用这样的方式来实现。
又能把请求传递下去又能让处理者之间,以及处理者和客户端之间解耦,真的很巧妙。
不过像上面说的,继任者是由客户端决定的,但实际上具体处理者之间有潜在的逻辑关系,如果客户端没有正确的设置链条可能会导致请求得不到处理。
比如上面的例子,直接拿洗好的鸭子去包装显然是包装不了的。
所以需要把文档写得足够清晰,以供客户端正确使用。

设计模式 | 职责链模式(Chain of responsibility)的更多相关文章

  1. 设计模式:职责链模式(Chain of Responsibility)

    去年参加校招要到长沙来,这个对于我来说不是特别喜欢(但又必须的来,谁叫咱不是985.211的娃呢),但是对于某些人来说就是福音了.大四还有课,而且学校抓的比较严,所以对于那些想翘课的人来说这个是最好不 ...

  2. C#设计模式——职责链模式(Chain Of Responsibility Pattern)

    一.概述 在软件开发中,某一个对象的请求可能会被多个对象处理,但每次最多只有一个对象处理该请求,对这类问题如果显示指定请求的处理对象,那么势必会造成请求与处理的紧耦合,为了将请求与处理解耦,我们可以使 ...

  3. atitit.设计模式(1)--—职责链模式(chain of responsibility)最佳实践O7 日期转换

    atitit.设计模式(1)---职责链模式(chain of responsibility)最佳实践O7 日期转换 1. 需求:::日期转换 1 2. 可以选择的模式: 表格模式,责任链模式 1 3 ...

  4. 设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型)

     设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型) 1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决,不能解决就 ...

  5. 责任链模式 职责链模式 Chain of Responsibility Pattern 行为型 设计模式(十七)

    责任链模式(Chain of Responsibility Pattern) 职责链模式 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系 将这些对象连接成一条链,并沿着这 ...

  6. 设计模式 ( 十二 ) 职责链模式(Chain of Responsibility)(对象行为)

     设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型) 1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决.不能解决就 ...

  7. 职责链模式(Chain of Responsibility)(对象行为型)

    1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决,不能解决就推卸给另外个一个部门(对象).至于到底谁来解决这个问题呢?政府部门就是为了可以避免屁民的请求与 ...

  8. 设计模式之职责链模式(Chain of Responsibility)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  9. 行为型设计模式之职责链模式(Chain of Responsibility)

    结构 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 适用性 有多个的对象可以处理一个请求,哪个 ...

  10. 重温设计模式(三)——职责链模式(chain of responsibility)

    一. 写在前面的 这么多的设计模式,我觉得职责链是我第一次看上去最简单,可是回想起来却又最复杂的一个模式. 因此,这个文章我酝酿了很久,一直也没有胆量发出来,例子也是改了又改,可是仍然觉得不够合理.所 ...

随机推荐

  1. 手撸Mysql原生语句--增删改查

    mysql数据库的增删改查有以下的几种的情况, 1.DDL语句 数据库定义语言: 数据库.表.视图.索引.存储过程,例如CREATE DROP ALTER SHOW 2.DML语句 数据库操纵语言: ...

  2. Akka Netty 比较

    从Akka出现背景来说,它是基于Actor的RPC通信系统,它的核心概念也是Message,它是基于协程的,性能不容置疑:基于scala的偏函数,易用性也没有话说,但是它毕竟只是RPC通信,无法适用大 ...

  3. Python练习题 003:完全平方数

    [Python练习题 003]一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? --------------------------------------- ...

  4. EF Entity Framework Core DBContext中文文档

    Add(Object) 以添加状态开始跟踪给定的实体和任何其他尚未被跟踪的可访问实体,以便在调用SaveChanges()时将它们插入数据库.使用State设置单个实体的状态. Add<TEnt ...

  5. 《kubernetes + .net core 》dev ops部分

    目录 1.kubernetes 预备知识 1.1 集群资源 1.1.1 role 1.1.2 namespace 1.1.3 node 1.1.4 persistent volume 1.1.5 st ...

  6. ThinkPHP 5 生命周期

    前段时间用TP5开发了一个小程序,就熟悉了一下TP5.TP5是TP框架最新的一个版本,与以前的3还是有很大的区别,有人说和laravel比较靠近,其实也还好,每个人都有自己不同的看法,只要是选择一个自 ...

  7. DevOps元素周期表—2号元素Kibana

    Kibana 是一款开源的数据分析和可视化平台,它是 Elastic Stack 成员之一,设计用于和 Elasticsearch 协作.您可以使用 Kibana 对 Elasticsearch 索引 ...

  8. CPU 执行程序的秘密,藏在了这 15 张图里

    前言 代码写了那么多,你知道 a = 1 + 2 这条代码是怎么被 CPU 执行的吗? 软件用了那么多,你知道软件的 32 位和 64 位之间的区别吗?再来 32 位的操作系统可以运行在 64 位的电 ...

  9. 在自己电脑上查看git远程分支列表比实际云端的远程分支要多一些

    问题 最近打开一个很久没有打开过的项目,使用git branch -a查看了一下所以分支,其中有些远程分支没有什么用了 于是准备去gitlab上删除它,结果到gitlab上发现没有这些分支,猜测是自己 ...

  10. 天啦噜!知道硬盘很慢,但没想到比 CPU L1 Cache 慢 10000000 倍

    前言 大家如果想自己组装电脑的话,肯定需要购买一个 CPU,但是存储器方面的设备,分类比较多,那我们肯定不能只买一种存储器,比如你除了要买内存,还要买硬盘,而针对硬盘我们还可以选择是固态硬盘还是机械硬 ...