GoF23种设计模式之行为型模式之责任链模式
一、概述
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并且沿着这条链传递请求,直到有一个对象处理它为止。其设计思想是:给对多个对象处理一个请求的机会,从而解耦请求发送者和接收者。
二、适用性
1.有多个对象可以处理一个请求,到底是哪个对象处理请求,交由运行时刻自动确定的时候。
2.你想在不明确指定接收者的情况下,向多个对象中的一个发送请求的时候。
3.可以处理一个请求的对象集合应该被动态指定的时候。
三、参与者
1.Handler:定义一个处理请求的接口。可能的话实现后继链(option)。
2.ConcreteHandler:链上的具体处理者。处理它负责的请求。可以访问它的后继。如果可以处理该请求,就处理;否则将该请求转发给其后继。
3.Client:向链上的具体处理者对象提交请求。
四、类图
五、示例
Handler
- package cn.lynn.chainofresponsibility;
- public interface IRequestHandler {
- public void handleRequest(IRequest request);
- }
ConcreteHandler
- package cn.lynn.chainofresponsibility;
- public class SunRequestHandler implements IRequestHandler {
- @Override
- public void handleRequest(IRequest request) {
- if(request instanceof FightRequest) {
- System.out.println("悟空火眼金睛,三打白骨精!");
- }
- }
- }
- package cn.lynn.chainofresponsibility;
- public class ZhuRequestHandler implements IRequestHandler {
- private IRequestHandler handler;
- public ZhuRequestHandler(IRequestHandler handler) {
- this.handler = handler;
- }
- @Override
- public void handleRequest(IRequest request) {
- if(request instanceof PeepRequest) {
- System.out.println("八戒偷窥嫦娥,被贬下凡!");
- }
- handler.handleRequest(request);
- }
- }
- package cn.lynn.chainofresponsibility;
- public class ShaRequestHandler implements IRequestHandler {
- private IRequestHandler handler;
- public ShaRequestHandler(IRequestHandler handler) {
- this.handler = handler;
- }
- @Override
- public void handleRequest(IRequest request) {
- if(request instanceof FindRequest) {
- System.out.println("师傅让妖怪抓走了,沙增找不到!");
- }
- handler.handleRequest(request);
- }
- }
Client
- package cn.lynn.chainofresponsibility;
- public class Client {
- public static void main(String[] args) {
- IRequestHandler sun = new SunRequestHandler();
- IRequestHandler zhu = new ZhuRequestHandler(sun);
- IRequestHandler sha = new ShaRequestHandler(zhu);
- IRequest request = new FindRequest();
- sha.handleRequest(request);
- request = new PeepRequest();
- zhu.handleRequest(request);
- request = new FightRequest();
- sun.handleRequest(request);
- }
- }
Result
- 师傅让妖怪抓走了,沙增找不到!
- 八戒偷窥嫦娥,被贬下凡!
- 悟空火眼金睛,三打白骨精!
GoF23种设计模式之行为型模式之责任链模式的更多相关文章
- 设计模式之jdk动态代理模式、责任链模式-java实现
设计模式之JDK动态代理模式.责任链模式 需求场景 当我们的代码中的类随着业务量的增大而不断增大仿佛没有尽头时,我们可以考虑使用动态代理设计模式,代理类的代码量被固定下来,不会随着业务量的增大而增大. ...
- Java 设计模式系列(二二)责任链模式
Java 设计模式系列(二二)责任链模式 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求 ...
- Delphi 设计模式:《HeadFirst设计模式》---行为模式之责任链模式
模式解说 责任链模式是一种对象的行为模式,它将处理客户端请求的那些对象联成一条链,并沿着这条链传递请求,直到有一个对象处理它为止. 通常使用在以下场合 1 有多个对象可以处理一个请求,哪个对象处理该请 ...
- Python的组合模式与责任链模式编程示例
Python的组合模式与责任链模式编程示例 这篇文章主要介绍了Python的组合模式与责任链模式编程示例,组合模式与责任链模式都属于Python的设计模式,需要的朋友可以参考下 组合模式 我们把Com ...
- Java设计模式(19)——行为模式之责任链模式(chain of responsibilitiy)
一.概述 概念 UML简图 角色 抽象处理器:定义处理请求的接口 具体处理器:接收到请求后可以选择处理,也可以选择发给下家处理(持有下家的引用) 当然这里必须指出,实际中纯的责任链模式很难寻找,一般是 ...
- 设计模式之(十四)责任链模式(Chain of Responsibility)
在业务场景中,有很多是需要审批的.审核方式还可能常常发生变化,而责任链模式就是为了解决这种场景的情况的. 责任链模式定义:十多个对象都有机会处理请求,从而避免发送者和接受者之间的耦合关系.讲这些对象连 ...
- 【责任链模式】责任链模式结合Spring实战Demo
备注: 责任链与策略模式有很多相似之处,如都是行为型设计模式,都能够处理代码中的if-else逻辑 主要区别在于: 策略模式 封装了算法,通过上下文对象去接受客户端的数据,根据数据类型执行不同的算法 ...
- 十一个行为模式之责任链模式(Responsible Chain Pattern)
定义: 将具有相同接口的责任类串行在一起,解耦请求的发送者和处理者.沿着这条链进行请求,直到有对象处理它为止. 结构图: Handler:抽象处理类,定义了所有责任类处理方法的接口,不同的处理方法在子 ...
- Java设计模式从精通到入门一 责任链模式
一直都想对设计模式有一个深刻的认识,这样对于阅读源码的时候就不会那么吃力了.于是有了想要记录下设计模式的笔记.打算从自己不怎么熟悉的设计模式开始写,里面穿插着一点自己的想法,希望自己写完后,会又一 ...
- 设计模式学习总结(十)责任链模式(Chain Of Responsibility)
责任链主要指通过一连串的操作来实现某项功能或者在处理相关的业务时,对于自己的业务则进行处理,反之,对于不属于自己的业务,则进行下发! 一.示例展示: 以下例子主要通过对煤矿对井下警告信息的处理来进 ...
随机推荐
- Codeforces Round #563 (Div. 2) A. Ehab Fails to Be Thanos
链接:https://codeforces.com/contest/1174/problem/A 题意: You're given an array aa of length 2n2n. Is it ...
- Net Core 2.0生态1
Net Core 2.0生态 阅读目录 前言:答读者问(time by:2017.8.19) 项目升级到ASP.NET Core 2.0 新增功能:Razor Pages介绍 模板更新 Entity ...
- 安装Jaspersoft Studio
下载位置:http://community.jaspersoft.com/project/jaspersoft-studio/releases.
- es6新语法:let、const
关于浏览器的兼容情况,可以访问can i use进行查询. 目前的主要方式还是通过使用Babel编译来解决兼容性问题. 我们目前使用Babel将ES6的代码兼容到了IE8,但这是在放弃某些新特性的条件 ...
- EF5 通用数据层 增删改查操作,泛型类
using System; using System.Collections.Generic; using System.Data.Entity.Infrastructure; using Syste ...
- 报错:java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.xxx.entity.PersonEntity
报错:java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.xxx.entity.PersonEntity 代 ...
- Spring事务的5种隔离级别
概述:isolation设定事务的隔离级别,事务管理器根据它来控制另外一个事务可以看到本事务内的哪些数据. 定义的5个不同的事务隔离级别: DEFAULT:默认的隔离级别,使用数据库默认的事务隔离级别 ...
- I Have a Dream(我有一个梦想)
I Have a Dream by Martin Luther King, Jr. I am happy to join with you today in what will go down in ...
- mysql 忘记root密码的解决办法
1.修改MySQL的登录设置: # vim /etc/my.cnf 在[mysqld]的段中加上一句:skip-grant-tables 例如: [mysqld] datadir=/var/lib/m ...
- LR脚本示例之常用函数
1.变量和参数的设置 //将IP地址和端口放入到参数中lr_save_string("127.0.0.1:1080","ip"); //退出脚本建议使用lr_e ...