Java进阶篇设计模式之八 ----- 责任链模式和命令模式

 

前言

上一篇中我们学习了结构型模式的享元模式和代理模式。本篇则来学习下行为型模式的两个模式, 责任链模式(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
                    
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信