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) 可怜的加薪、请假之路相关推荐

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

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

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

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

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

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

  4. 乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)

    原文:乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern) [索引页] [源码下载] 乐在其中设计模式(C#) - 责任链模式(Chain of ...

  5. 二十四种设计模式:责任链模式(Chain of Responsibility Pattern)

    责任链模式(Chain of Responsibility Pattern) 介绍 为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求.将这些对象连成一条链,并沿着这条链传递该请求, ...

  6. 设计模式的理解: 职责链模式 (Chain of Responsibility)

    职责链模式(Chain of Responsibility Pattern),为请求创建了一个接收者对象的链.这种模式给予请求的类型,对请求的发送者和接收者进行解耦.这种类型的设计模式属于行为型模式. ...

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

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

  8. 职责链模式(chain of responsibility)

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

  9. 职责链模式 Chain of Responsibility

    职责链模式的作用在于职责转移,其实现实际上是一个链表 package chainofres;public abstract class Handler {protected Handler succe ...

最新文章

  1. 【ubuntu】ubuntu14.04、16.04、18.04 LTS版本支持时间
  2. 一款高颜值的 SpringBoot+JPA 博客项目
  3. 修改选中_win7文件名称如何批量修改
  4. 数据结构----二叉树叶子结点到根节点的高度计算
  5. [html] 页面上的登录表单记住了密码(显示星号),但我又忘了密码,如何找回这个密码呢?
  6. linux重新启动某一个项目,Linux运维知识之supervisor更改某项目配置后 需要重新启动才有效...
  7. 2016下半年网络规划设计师考试上午真题
  8. @Target({ElementType.METHOD, ElementType.TYPE})
  9. Hadoop学习心得
  10. web平台安全测试方案
  11. STM32控制SG90舵机与超声波HC_SR04测距模块
  12. Navigation导航系统
  13. 从深圳流水线女工到美国谷歌程序员-一位女孩的奋斗史诗
  14. php正则表达式工具,正则表达式语法教程(含在线测试工具)
  15. postgresql仅修改时间戳的时分秒写法
  16. 多系统下的蓝牙设备共用配对问题之LTK、EDIV、ERAND.以 Manjaro、Debian、Windows10 为例
  17. 理赔实录|有了「安心赔」,理赔不再愁
  18. BZOJ 4372 烁烁的游戏
  19. 给图片加水印的简单方法,手机图片加水印也可以用
  20. Matlab 元胞数组和结构体

热门文章

  1. c语言字符串截取_笔记 | 自学Python 05:数据类型之字符串
  2. 关于python_关于 Python
  3. UE4如何贴混合贴图_UE4[蓝图]动态积雪材质的实现(一)
  4. iphone闪退修复工具_iOS14到底怎么样?汇总2866部iPhone的升级体验
  5. Androd开发之通过ComponentName和setComponent以及scheme打开外部应用 | 打开任意页面 | 打开指定页面
  6. Android ble covana,I’m A Lie
  7. mysql delete 表关联删除数据_mysql delete 多表连接删除功能
  8. php get请求 json返回,[1.23]-请求和响应:GET和POST两者皆可得及超越JSON格式返回 | PhalApi(π框架) - PHP轻量级开源接口框架 - 接口,从简单开始!...
  9. java23种设计模式之五:代理模式
  10. 担忧医生因AI技术而失业?杞人忧天