设计模式系列之九:职责链模式

前言

责任链模式属于行为型设计模式,所谓责任链,就是把责任处理对象连成一条链,这样当一个处理对象不能及时处理的时候就会交给下一个处理对象处理,直到被处理为止。就像我们找人签字盖章的时候,当一个对象不能处理的时候他会告诉你你应该下一个部门进行盖章,而如果下一个部门仍然不能处理就会继续告诉你下一个应该去的部门,直到把章盖好。这个例子不一定恰当,但是反映了责任传递这么一个过程。责任传递是责任链模式的核心,责任链模式使得多个处理对象有机会处理请求,从而避免请求发送者与请求接收者之间的解耦,把这些对象连成一条链,并把请求沿着这条链进行传递,直到完成请求的处理。请求发送者并不需要哪一个对象处理这个请求,因为总有一个请求接收者进行处理。在责任链模式中,由于请求的处理对象要形成一条链,所以每一个处理对象都要保存下一个处理对象的引用,这点与数据结构中的链表很相似。

问题背景

假设小张需要申请加薪,于是他首先向部门经理申请,部门经理觉得这个他做不了主于是又汇报给总监,总监觉得他也做不了主,于是就汇报给总经理,总经理觉得小张的表现很不错,遂同意小张的加薪申请。

那么就根据责任链模式进行编码

package default;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DutyChainMode{

    //管理人员抽象类
    public abstract class Manager{
        protected String name;
        protected Manager superior;

        public Manager(String name,Manager superior){
            this(name);
            this.superior = superior;
        }

        public Manager(String name){this.name = name;}

        public void setName(String name){this.name = name;}
        public String getName(){return name;}
        public void setSuperior(Manager superior){this.superior = superior;}
        public Manager getSuperior(){return superior;}

        public abstract void handleApplicationRequest(String content,double limit);
        public abstract String getHanldeObject();
    }

    //部门经理
    public class DepartmentManager extends Manager{
        public DepartmentManager(String name){super(name);}

        public void handleApplicationRequest(String content,double limit){
            if(content.equals("加薪")){
                superior.handleApplicationRequest(content,limit);
            }
        }

        public String getHanldeObject(){
            return "部门经理";
        }
    }

    //总监
    public class Majordomo extends Manager{
        public Majordomo(String name){super(name);}

        public void handleApplicationRequest(String content,double limit){
            if(content.equals("加薪") && Math.floor(limit) < 100){
                System.out.println(getHanldeObject() + "已经加薪申请。处理时间" + new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
            }else if(content.equals("加薪") && Math.floor(limit) > 100){
                superior.handleApplicationRequest(content,limit);
            }
        }

        public String getHanldeObject(){
            return "总监";
        }
    }

    //总经理
    public class GeneralManager extends Manager{
        public GeneralManager(String name){super(name);}

        public void handleApplicationRequest(String content,double limit){
            if(content.equals("加薪")){
                System.out.println(getHanldeObject() + "已经加薪申请。处理时间" + new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
            }
        }

        @Override
        public String getHanldeObject() {
            return "总经理";
        }
    }

    //申请人
    public class Applicant{
        private String name;
        private String content;
        private Manager manager;

        public Applicant(String name){this.name = name;}

        public Applicant(String name,Manager manager){this(name);this.manager = manager;}

        public void setName(String name){this.name = name;}
        public String getName(){return name;}
        public void setContent(String content){this.content = content;}
        public String getContent(){return content;}
        public void setManager(Manager manager){this.manager = manager;}
        public Manager getManager(){return manager;}

        public void submitApplicationRequest(String content,double limit){
            manager.handleApplicationRequest(content,limit);
        }

    }

    public static void main(String[] args){
        DutyChainMode dm = new DutyChainMode();

        Applicant xiaozhang = dm.new Applicant("小张");
        Manager departmentManager = dm.new DepartmentManager("经理");
        Manager majordomo = dm.new Majordomo("总监");
        Manager genralManager = dm.new GeneralManager("总经理");

        departmentManager.setSuperior(majordomo);
        majordomo.setSuperior(genralManager);

        xiaozhang.setManager(departmentManager);
        xiaozhang.submitApplicationRequest("加薪", 400);

    }
}

测试结果:

可以发现,Applicant对象仅仅是把加薪申请直接提交给他的直接上级,至于他的直接上级能否处理则不是他需要关心的了,对与申请人来说他只关心申请处理的结果,处理细节不需要关心。而处理细节是在Manager对象中进行定义的,通过设置上下级关系使得申请可以被逐级交给下一个处理对象进行处理,这也是责任链模式最吸引人的地方。当然模式总会有不足,比如,如果当申请提交到总经理那里的时候,总经理没有进行及时处理就会造成申请人的持续等待,这时我们不希望看到的。最后,我们再对责任链模式进行一个简单的总结:

  1. 发送者不需要知道接收者的具体信息,只要交给一个接收者就可以了。降低了客户与系统的耦合程度
  2. 对于每一个具体的处理对象来讲,它只需要保存其下一个处理对象的引用就可以了,这样就使得处理对象之间的耦合度降低
  3. 责任链的结构是在客户端定义的,这就使得可以随时增加或者修改责任链的结构,增强了指派责任的灵活性
  4. 如果请求到达责任链的末端仍然没有处理就会造成客户端的等待
时间: 2024-10-30 13:24:49

设计模式系列之九:职责链模式的相关文章

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

一.写在前面的 这么多的设计模式,我觉得职责链是我第一次看上去最简单,可是回想起来却又最复杂的一个模式. 因此,这个文章我酝酿了很久,一直也没有胆量发出来,例子也是改了又改,可是仍然觉得不够合理.所以希望各位多多指教. 二.什么是链 文章伊始,先让我们了解这个最基本的概念,什么是链. 我给链下了这样的定义: 1.链是一系列节点的集合. 2.链的各节点可灵活拆分再重组. 三.何为职责链 职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着

php设计模式 Chain Of Responsibility (职责链模式)

复制代码 代码如下: <?php /** * 职责链模式 * * 为解除请求的发送者和接收者之间的耦合,而使用多个对象都用机会处理这个请求,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它 * */ abstract class Handler { protected $_handler = null; public function setSuccessor($handler) { $this->_handler = $handler; } abstract functio

php设计模式 Chain Of Responsibility (职责链模式)_php技巧

复制代码 代码如下: <?php /** * 职责链模式 * * 为解除请求的发送者和接收者之间的耦合,而使用多个对象都用机会处理这个请求,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它 * */ abstract class Handler { protected $_handler = null; public function setSuccessor($handler) { $this->_handler = $handler; } abstract functio

深入理解JavaScript系列(38):设计模式之职责链模式详解_基础知识

介绍 职责链模式(Chain of responsibility)是使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止. 也就是说,请求以后,从第一个对象开始,链中收到请求的对象要么亲自处理它,要么转发给链中的下一个候选者.提交请求的对象并不明确知道哪一个对象将会处理它--也就是该请求有一个隐式的接受者(implicit receiver).根据运行时刻,任一候选者都可以响应相应的请求,候选者的数目是任意

设计模式学习笔记(十九)—Chain of Responsibility职责链模式

由于本人水平有限,写出来的东西也许对初学者有所帮助.如果不小心哪位大侠看了不要见笑,哪里有不正确的地方还请批评指正.好了不说废话了. Chain of Responsibility模式定义: 为了避免请求的发送者和接收者之间的耦合关系,使多个接受对象都有机会处理请求.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 我的理解: 在不止一个对象可以处理客户端请求的时候,为了使每个对象都有处理请求的机会,把这些对象顺序地串联起来形成一个链,每个被串联的对象都有一个指向下一个对

PHP设计模式——职责链模式

声明:本系列博客参考资料<大话设计模式>,作者程杰.        职责链模式(又叫责任链模式)包含了一些命令对象和一些处理对象,每个处理对象决定它能处理那些命令对象,它也知道应该把自己不能处理的命令对象交下一个处理对象,该模式还描述了往该链添加新的处理对象的方法.        UML类图:                  角色:                  抽象处理者(Manager):定义出一个处理请求的接口.如果需要,接口可以定义出一个方法,以设定和返回对下家的引用.这个角色通

设计模式 ( 十二 ) 职责链模式(Chain of Responsibility)(对象行为)

 设计模式(十二)职责链模式(Chain of Responsibility)(对象行为型) 1.概述        你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决,不能解决就推卸给另外个一个部门(对象).至于到底谁来解决这个问题呢?政府部门就是为了可以避免屁民的请求与官员之间耦合在一起,让多个(部门)对象都有可能接收请求,将这些(部门)对象连接成一条链,并且沿着这条链传递请求,直到有(部门)对象处理它为止. 例子1:js的事件浮升机制 例子2: 2.问题

C++设计模式之职责链模式_C 语言

前言 最近心情很差,因为生活,因为工作:所以想请几天假去丽江玩玩.就向项目经理提交了休假申请,我的项目经理向项目主管提交了我的休假申请,项目主管向部门经理提交了我的休假申请:最后,部门经理同意了我的休假申请.是的,一个简单的休假申请,需要这么复杂的流程,这也是一个公司保证它正常运行的必要.如果部门经理休假了,那么我的休假申请由谁审批呢?这个时候由项目主管代替部门经理进行审批.一个休假申请的审批制度有着严格的要求.而在处理这个请假审批时,各个人员就好比在一条链上的节点,我不知道我的请求由谁审批,但

【设计模式】—— 职责链模式ChainOfResponsibility

模式意图 避免请求的发送者,和接受者过度的耦合在一起.一个请求者只需要发送一个请求即可,它的请求具体由后面哪个对象进行响应,并不需要关心.而请求的接受者可以自己处理它,也可以把它像链条一样向后传. 因此,请求也就意味着有可能丢失,或者说没有确切的安全保障. 应用场景 1 降低耦合度 2 增强指派职责的灵活性 3 不保证被接受 模式结构 Handler 定义一个接口,实现向后传递的过程 1 abstract class Handler{ 2 protected Handler successor;

职责链模式(chain of responsibility)

原文地址 一. 写在前面的 这么多的设计模式,我觉得职责链是我第一次看上去最简单,可是回想起来却又最复杂的一个模式. 因此,这个文章我酝酿了很久,一直也没有胆量发出来,例子也是改了又改,可是仍然觉得不够合理.所以希望各位多多指教. 二. 什么是链 文章伊始,先让我们了解这个最基本的概念,什么是链. 我给链下了这样的定义: 链是一系列节点的集合. 链的各节点可灵活拆分再重组. 三. 何为职责链 职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链