前言
在上一篇中我们学习了结构型模式的享元模式和代理模式。本篇则来学习下行为型模式的两个模式, 责任链模式(Chain of Responsibility Pattern)和命令模式(Command Pattern)。
责任链模式
简介
责任链模式顾名思义,就是为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。
简单的理解的话就是进行层级处理。生活中比较常见的是请假、出差、加薪等申请等等,而工作中比较常见的就是拦截器和过滤器。如果请假申请是用以前的那种方式,发起者需要和每个负责人进行申请,会比较麻烦,但是现在一般是走OA流程,只需发起一个OA申请即可。这也是一种 这种就是典型的责任链模式,发起者只需将请求请求发送到职责链上即可,无需关心处理细节和请求的传递。
责任链模式主要由这三个角色组成,请求接收者接口(Handler)、请求实现者类(ConcreteHandler)和请求发送者(Client)。
- 请求接收者接口:定义可以处理客户端请求事项的接口,包含“可链接下一个同样能处理请求”的对象引用。
- 请求实现者类:实现请求处理接口,并判断对象本身是否能够处理本次请求,如果不能完成请求,则交由后继者来处理。
- 请求发送者:将请求发送给第一个接收者对象,并等待请求的回复。
这里为了方便理解,我们使用一个简单的示例来加以说明。
在某公司的某个部门中,为了活跃部门气氛,主管便征求部门成员的意见,于是部门的成员踊跃提出建议,最终,主管采纳了 xuwujing 提倡的建议,并将此建议进行上报,申请活动经费。
那么我们便可以根据这里例子来使用责任链模式进行开发,首先加速有三级的领导,他们有个共同的特性,就是可以处理各自级别的事情,那么我们便可以定义一个领导的抽象类,并定义一个抽象方法可以处理事情,并设置一个级别的参数,那么这个抽象类的代码如下:
abstract class Learder{ protected Learder learder; protected void setLearder(Learder learder){ this.learder=learder; } protected Learder getLearder(){ return learder; } abstract void handler(int level); } 定义好该抽象类之后,我们需要设计不同的领导进行不同的处理,但是这些领导需要有个处理的能力,并且还要根据各自不同的权限进行处理,如果能够处理,到此流程就结束了,否则无法处理则转交给上级进行处理。
那么代码如下:
class Supervisor extends Learder{ private String name; private String something; public Supervisor(String name,String something) { this.name=name; this.something=something; } @Override void handler(int level) { //如果级别在自己的处理范围之内 if(level>1){ System.out.println("主管同意了 "+name+"所述的<"+something+">事情!"); }else{ System.out.println("主管未能处理 "+name+"所述的<"+something+">事情!转交给上级!"); getLearder().handler(level); } } } class BranchManager extends Learder{ private String name; private String something; public BranchManager(String name,String something) { this.name=name; this.something=something; } @Override void handler(int level) { boolean flag=true; //如果级别在自己的处理范围之内 if(level>0){ //这就就直接设置同意了 if(flag){ System.out.println("部门经理同意了 "+name+"所述的<"+something+">事情!"); }else{ System.out.println("部门经理不同意 "+name+"所述的<"+something+">事情!"); } }else{ System.out.println("部门经理未能处理 "+name+"所述的<"+something+">事情!转交给上级!"); getLearder().handler(level); } } } class GeneralManager extends Learder{ private String name; private String something; public GeneralMan
