『设计模式』职责链模式(Chain of Responsibility) 可怜的加薪、请假之路
23种设计模式+额外常用设计模式汇总 (持续更新)
问题抽象
客户端发出一个请求,会有很多对象都可以来处理这个请求,而且不同对象的处理逻辑是不一样的。
对于客户端而言,无所谓谁来处理,反正有对象处理就可以了。而且在上述处理中,还希望处理流程是可以灵活变动的,而处理请求的对象需要能方便地修改或者是被替换掉,以适应新的业务功能的需要。
职责链模式
十多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连城一条链,并沿着这条链传递该请求,知道有一个对象处理它为止。
模式结构
抽象处理者(Handler)角色
定义出一个处理请求的接口。如果需要,接口可以定义出一个方法以设定和返回对下家的引用。这个角色通常由一个抽象类或接口实现。具体处理者(ConcreteHandler)角色
具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者司以访问下家。
处理过程
ConcreteHandler将自己的后继对象(向下传递消息的对象)记录在自己的后继表中,当一个请求到来时,ConcreteHandler会先检查看自己有没有匹配的处理程序,如果有就自己处理,否则传递给它的后继。
职责链模式降低了请求的发送端和接收端之间的耦合,使多个对象都有机会处理这个请求。
优点
请求者和接收者松散耦合
动态组合职责
缺点
产生很多细粒度对象
不一定能被处理:需要提供默认处理
本质
分离职责,动态组合,如果学习过状态模式,可以理解为可以动态设置转移方向的状态模式。
状态模式是一个对象的内在状态发生改变,一个对象,相对比较稳定,处理完一个对象下一个对象的处理一般都已确定
职责链模式过于灵话,在客户端使用时,需要环境去确定下一个对象是谁,一些列的set操作…职责链模式是多个对象之间的改变,就会出现某个对象不存在的情景。
实现:
我们使用百度百科的一个例子:
//申请
public class Request
{//申请类别private string requestType;public String getrequestType (){ return requestType; }public void setrequestType (string requestType){ this.requestType=requestType; }//申请内容private string requestContent;public String getrequestContent (){ return requestContent; }public void setrequestContent (string requestContent){ this.requestContent=requestContent; }//数量private int number;public int Number{get { return number; }set { number = value; }}
}
//管理者--Handler类,定义一个处理请求的接口
abstract public class Manager
{protected string name;//管理者上级protected Manager superior;public Manager(string name){this.name = name;}//设置管理者上级---关键的方法public void SetSuperior(Manager superior){this.superior = superior;}abstract public void RequestApplications(Request request);
}
//"经理类"就可以去继承这个"管理者"类,只需要重写"申请请求"的方法就可以
//经理类
public class CommonManager extends Manager
{public CommonManager(string name) { super(name);}publicvoid RequestApplications(Request request){//经理的权限可批准下属两天内的请假if (request.RequestType == "请假" && request.Number <= 2){Console.WriteLine("{0}:{1}数量{2}被批准", name, request.RequestContent, request.Number);}else{//其他的申请都要转到上级if (superior != null)superior.RequestApplications(request);}}
}
//"总监类"同样继承这个"管理者"类
//总监类
public class Majordomo extends Manager
{public Majordomo(string name) { super(name);}public void RequestApplications(Request request){//总监的权限可批准下属五天内的请假if (request.RequestType == "请假" && request.Number <= 5){System.out.println( name+":"+ request.RequestContent+"数量"+request.Number+"被批准");}else{//其他的申请都要转到上级if (superior != null)superior.RequestApplications(request);}}
}
//"总经理"的权限就是全部处理
//总监类
public class GeneralManager extends Manager
{public GeneralManager(string name) {super(name); }publicvoid RequestApplications(Request request){//总经理的权限可批准下属任意天数的请假if (request.RequestType == "请假"){System.out.println( name+":"+ request.RequestContent+"数量"+request.Number+"被批准");}else if (request.RequestType == "加薪"&&request.Number<=500){System.out.println( name+":"+ request.RequestContent+"数量"+request.Number+"被批准");}else if (request.RequestType == "加薪" && request.Number > 500){System.out.println( name+":"+ request.RequestContent+"数量"+request.Number+"在说吧");}}
}
public class Client
{//客户端代码public static void Main(string[] args){CommonManager jinli = new CommonManager("张三");Majordomo zongjian = new Majordomo("李四");GeneralManager zongjinli = new GeneralManager("王五");//设置上级jinli.SetSuperior(zongjian);zongjian.SetSuperior(zongjinli);Request request = new Request();request.RequestType = "请假";request.RequestContent = "XX请假";request.Number = 1;jinli.RequestApplications(request);Request request2 = new Request();request.RequestType = "加薪";request.RequestContent = "XX加薪";request.Number = 500;jinli.RequestApplications(request);}
}
『设计模式』职责链模式(Chain of Responsibility) 可怜的加薪、请假之路相关推荐
- 设计模式之职责链模式(Chain of Responsibility)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- atitit.设计模式(1)--—职责链模式(chain of responsibility)最佳实践O7 日期转换
atitit.设计模式(1)---职责链模式(chain of responsibility)最佳实践O7 日期转换 1. 需求:::日期转换 1 2. 可以选择的模式: 表格模式,责任链模式 1 3 ...
- 职责链模式(Chain of Responsibility)(对象行为型)
1.概述 你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决,不能解决就推卸给另外个一个部门(对象).至于到底谁来解决这个问题呢?政府部门就是为了可以避免屁民的请求与 ...
- 乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)
原文:乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern) [索引页] [源码下载] 乐在其中设计模式(C#) - 责任链模式(Chain of ...
- 二十四种设计模式:责任链模式(Chain of Responsibility Pattern)
责任链模式(Chain of Responsibility Pattern) 介绍 为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求.将这些对象连成一条链,并沿着这条链传递该请求, ...
- 设计模式的理解: 职责链模式 (Chain of Responsibility)
职责链模式(Chain of Responsibility Pattern),为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行为型模式. ...
- 重温设计模式(三)——职责链模式(chain of responsibility)
一. 写在前面的 这么多的设计模式,我觉得职责链是我第一次看上去最简单,可是回想起来却又最复杂的一个模式. 因此,这个文章我酝酿了很久,一直也没有胆量发出来,例子也是改了又改,可是仍然觉得不够合理.所 ...
- 职责链模式(chain of responsibility)
原文地址 一. 写在前面的 这么多的设计模式,我觉得职责链是我第一次看上去最简单,可是回想起来却又最复杂的一个模式. 因此,这个文章我酝酿了很久,一直也没有胆量发出来,例子也是改了又改,可是仍然觉得不 ...
- 职责链模式 Chain of Responsibility
职责链模式的作用在于职责转移,其实现实际上是一个链表 package chainofres;public abstract class Handler {protected Handler succe ...
最新文章
- 【ubuntu】ubuntu14.04、16.04、18.04 LTS版本支持时间
- 一款高颜值的 SpringBoot+JPA 博客项目
- 修改选中_win7文件名称如何批量修改
- 数据结构----二叉树叶子结点到根节点的高度计算
- [html] 页面上的登录表单记住了密码(显示星号),但我又忘了密码,如何找回这个密码呢?
- linux重新启动某一个项目,Linux运维知识之supervisor更改某项目配置后 需要重新启动才有效...
- 2016下半年网络规划设计师考试上午真题
- @Target({ElementType.METHOD, ElementType.TYPE})
- Hadoop学习心得
- web平台安全测试方案
- STM32控制SG90舵机与超声波HC_SR04测距模块
- Navigation导航系统
- 从深圳流水线女工到美国谷歌程序员-一位女孩的奋斗史诗
- php正则表达式工具,正则表达式语法教程(含在线测试工具)
- postgresql仅修改时间戳的时分秒写法
- 多系统下的蓝牙设备共用配对问题之LTK、EDIV、ERAND.以 Manjaro、Debian、Windows10 为例
- 理赔实录|有了「安心赔」,理赔不再愁
- BZOJ 4372 烁烁的游戏
- 给图片加水印的简单方法,手机图片加水印也可以用
- Matlab 元胞数组和结构体
热门文章
- c语言字符串截取_笔记 | 自学Python 05:数据类型之字符串
- 关于python_关于 Python
- UE4如何贴混合贴图_UE4[蓝图]动态积雪材质的实现(一)
- iphone闪退修复工具_iOS14到底怎么样?汇总2866部iPhone的升级体验
- Androd开发之通过ComponentName和setComponent以及scheme打开外部应用 | 打开任意页面 | 打开指定页面
- Android ble covana,I’m A Lie
- mysql delete 表关联删除数据_mysql delete 多表连接删除功能
- php get请求 json返回,[1.23]-请求和响应:GET和POST两者皆可得及超越JSON格式返回 | PhalApi(π框架) - PHP轻量级开源接口框架 - 接口,从简单开始!...
- java23种设计模式之五:代理模式
- 担忧医生因AI技术而失业?杞人忧天