什么是链?前后相连,一个连接下一个,其中包括多个节点,其实责任链模式也类似,他是多个对象之间相互关联,下一个对象的操作由上一个对象关联下来,上一个对象有个方法用于指向其他对象。职责链之间的前后关系是可以改变的,主要看上一节点主要指向哪个节点。

android中事件分发就是责任链模式的具体表现:

View的ontouchEvent返回值设置,如果为true,交个自己的消费事件的方法去处理,如果为false,则继续向下一个进行传递。

如何实现责任链模式:

比如责任链上有,A,B,C三个对象,如果A有权限则自己处理,否则传递下去给B,B如果没有权限处理,则传递下去,C如果有权限处理,则处理,否则不处理。

A中有判断的逻辑,一个是符合条件的,自己去处理,一个是不符合自身条件的,交给链条中的下一个对象去处理,B,C一次类推都是同样的道理。

花鼓传花比赛,失败表演节目的例子来讲讲:

首先创建责任链传递的抽象类:比如下面这个类:

基类,封装处理handler()和指向下一个节点setNextHandler()的方法:

public abstract class Handler {
protected Handler handler; public Handler setNextHandler(Handler carHandler) {
//根据参数指向下一个handler对象
this.handler = carHandler;
return this.handler;
} //当前对象的实际操作
public abstract void handler();
}

传花同学A:

public class AHandler extends Handler {

    @Override
public void handler() {
System.out.println("A表演节目");
if(this.handler != null){
this.handler.handler();
}
}
}

传花同学B:

public class BHandler extends Handler {

    @Override
public void handler() {
System.out.println("B表演节目");
if(this.handler != null){
this.handler.handler();
}
}
}

传花同学C:

public class CHandler extends Handler {

    @Override
public void handler() {
System.out.println("C表演节目");
if(this.handler != null){
this.handler.handler();
}
}
}

测试类:

public class Test {
public static void main(String[] args) {
Handler aHandler = new AHandler();
Handler bHandler = new BHandler();
Handler cHandler = new CHandler(); System.out.println("-------a==>b==>c--------");
aHandler.setNextHandler(bHandler);
bHandler.setNextHandler(cHandler);
aHandler.handler(); System.out.println("1-------b==>a==>c--------");
bHandler.setNextHandler(aHandler);
aHandler.setNextHandler(cHandler);
bHandler.handler(); System.out.println("2-------b==>a==>c--------");
bHandler.setNextHandler(aHandler).setNextHandler(cHandler);
bHandler.handler();
} }

测试结果:

-------a==>b==>c--------
A表演节目
B表演节目
C表演节目
1-------b==>a==>c--------
B表演节目
A表演节目
C表演节目
2-------b==>a==>c--------
B表演节目
A表演节目
C表演节目

设计模式 -- 责任链模式或者叫职责链模式(Chain of Responsibility(CoR))的更多相关文章

  1. 设计模式(二十四)——职责链模式(SpringMVC源码分析)

    1 学校 OA 系统的采购审批项目:需求是 采购员采购教学器材 1) 如果金额 小于等于 5000,  由教学主任审批 (0<=x<=5000) 2) 如果金额 小于等于 10000,   ...

  2. [Python设计模式] 第24章 加薪审批——职责链模式

    github地址:https://github.com/cheesezh/python_design_patterns 题目 用程序模拟以下情景 员工向经理发起加薪申请,经理无权决定,需要向总监汇报, ...

  3. Java设计模式(二十一):职责链模式

    职责链模式(Chain Of Responsibility Pattern) 职责链模式(Chain Of Responsibility Pattern):属于对象的行为模式.使多个对象都有机会处理请 ...

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

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

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

    1.职责链模式讲解 1.1职责链定义 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 1.2职责链模式 ...

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

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

  7. C#设计模式之二十一职责链模式(Chain of Responsibility Pattern)【行为型】

    一.引言   今天我们开始讲"行为型"设计模式的第八个模式,该模式是[职责链模式],英文名称是:Chain of Responsibility Pattern.让我们看看现实生活中 ...

  8. C#设计模式之二十职责链模式(Chain of Responsibility Pattern)【行为型】

    一.引言 今天我们开始讲“行为型”设计模式的第八个模式,该模式是[职责链模式],英文名称是:Chain of Responsibility Pattern.让我们看看现实生活中的例子吧,理解起来可能更 ...

  9. 设计模式-责任链模式Chain of Responsibility)

    一.定义 职责链模式是一种对象的行为模式.在职责链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链 ...

随机推荐

  1. swift设置textfield边框颜色

    //swift3.0,如果是2.0的话也可以照着这个样子去写,语法有所变动.根据联想出来的就可以了. let tx = UITextField(frame: CGRect(x: 100, y: 100 ...

  2. .NET基础——数组

    这一篇,我们来看C#中的数组. 1. 数组的概念 数组:存储相同类型多个数据元素的容器 数组的声明和初始化: 在创建数组的时候,必须指定数组的长度 ]; ,, }; ] { , , };//数组元素的 ...

  3. Chrome使用小技巧-多用户登录、直接打开隐身模式窗口

    在开发过程中,有时候需要打开2个chrome,各自登录一个账号来做测试,正常情况下由于同一用户下的chrome共享cookies的原因,是没办法登录2个账号的. 这种情况,可以找到chrome图标,点 ...

  4. js动画(二)

    嗯,今天好冷,特别冷,我的手指,都冻的打不了字了.今天一件特别的傻的事就是,在 for(var i;i<obj.length;i++){} 找了半天没有注意到 var i 没有赋值.够150 了 ...

  5. [转载]关于shell脚本的基本语法

    关于shell脚本的基本语法 整理于:2014-03-31,何俭飞,mymladdr@sina.com 一.执行 1.shell脚本如果要被执行,一般地必须要有执行权限"x"(除了 ...

  6. ThinkPhp 源码阅读心得

    php 中header 函数 我可能见多了,只要用来跳转.今天在阅读TP源码的时候发现,header函数有第三个参数.有些困惑所以找到手册查阅下,发现 void header ( string $st ...

  7. ASP.NET Zero--7.控制器加权限

    上次已经实现了菜单权限的配置,达到了不同角色的用户显示不同的菜单.但这里还有BUG,如果你直接访问http://localhost:8019/Mpa/Test这个控制器时,并使用"Defau ...

  8. 运行ORB-SLAM笔记_使用篇(二)

    1. 编译完成之后就可以使用了,按照说明我们可以知道,首先开启roscore

  9. (七)第一个python程序!

    这是对我自己来说比较有仪式的一篇随笔记录,说了那么多,开始第一个pyhton小程序吧! 首先找一个版本比较新的Linux系统, 执行Python –V 查看一下你的Python版本: # python ...

  10. Ubuntu16 64位安装steam, 并解决无法启动的问题

    直接用crtl+shift打开终端,运行下面的命令. sudo add-apt-repository multiverse sudo apt update sudo apt install steam ...