Java设计模式——Chain of Responsibility(责任链)模式

如果将若干对象按照某种层次结构进行组织,比如组织为类责任链,客户端代码就有可能不必事先了解自己将使用哪一个类。在这种情况下,链中的每个对象都有一个方法,当客户端代码调用该方法的时候,这些对象要么执行该方法,要么沿着这条链转发该方法调用请求。

责任链模式可让每个对象都有一次机会决定自己是否处理请求,以便于避免请求的发送者与其接收者之间的耦合。

责任链模式的目的是减轻调用者的压力,让它们无需了解哪个对象可以处理调用请求。

如果开发过程中遇到以下几种情况,可以考虑应用责任链模式:

  • 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定
  • 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求
  • 可处理一个请求的对象集合应被动态指定

看一个应用责任链模式的类图

1、定义一个处理请求的接口,(可选)实现后继链

public interface RequestHandle {

    void handleRequest(Request request);
}

2、处理它所负责的请求,可访问它的后继者。如果可处理该请求,就处理之;否则将该请求转发给它的后继者。

public class HRRequestHandle implements RequestHandle {

    public void handleRequest(Request request) {
        if (request instanceof DimissionRequest) {
            System.out.println("要离职, 人事审批!");
        } 

        System.out.println("请求完毕");
    }
}
public class PMRequestHandle implements RequestHandle {

    RequestHandle rh;

    public PMRequestHandle(RequestHandle rh) {
        this.rh = rh;
    }

    public void handleRequest(Request request) {
        if (request instanceof AddMoneyRequest) {
            System.out.println("要加薪, 项目经理审批!");
        } else {
            rh.handleRequest(request);
        }
    }
}
public class TLRequestHandle implements RequestHandle {

    RequestHandle rh;

    public TLRequestHandle(RequestHandle rh) {
        this.rh = rh;
    }

    public void handleRequest(Request request) {
        if (request instanceof LeaveRequest) {
            System.out.println("要请假, 项目组长审批!");
        } else {
            rh.handleRequest(request);
        }
    }
}

3、向链上的具体处理者(ConcreteHandler)对象提交请求

public class Test {

    public static void main(String[] args) {
        RequestHandle hr = new HRRequestHandle();
        RequestHandle pm = new PMRequestHandle(hr);
        RequestHandle tl = new TLRequestHandle(pm);

        //team leader处理离职请求
        Request request = new DimissionRequest();
        tl.handleRequest(request);

        System.out.println("===========");
        //team leader处理加薪请求
        request = new AddMoneyRequest();
        tl.handleRequest(request);

        System.out.println("========");
        //项目经理上理辞职请求
        request = new DimissionRequest();
        pm.handleRequest(request);
    }
}

当应用责任链模式后,客户端代码不必事先知道对象集合中哪个对象可提供自己所需要的服务。当客户端代码发出调用请求之后,该请求沿着责任链转发,直到找到提供该服务的对象为止。这样可大大降低客户端代码与提供服务的对象之间的耦合程度。

时间: 2024-08-02 16:54:21

Java设计模式——Chain of Responsibility(责任链)模式的相关文章

Java设计模式(九)责任链模式 命令模式

(十七)责任链模式 责任链模式的目的是通过给予多个对象处理请求的机会,已解除请求发送者与接受者之间的耦合关系.面对对象的开发力求对象之前保持松散耦合,确保对象各自的责任最小化,这样的设计可以使得系统更加容易修改,同时降低产生缺陷的风险. public class ChainTest { public static void main(String[] args) { String pass1="123456"; String pass2="123456"; Stri

Chain of Responsibility责任链模式(C++责任链模式)

Chainof Responsibility责任链模式:相当于MFC,windows程序设计窗口中的消息机制这类. MFC中,消息是通过一个向上递交的方式进行处理,例如一个WM_COMMAND消息的处理流程可能为: 1) MDI主窗口(CMDIFrameWnd)收到命令消息WM_COMMAND,其ID位ID_×××: 2) MDI主窗口将消息传给当前活动的MDI子窗口(CMDIChildWnd): 3) MDI子窗口给自己的子窗口(View)一个处理机会,将消息交给View: 4) View检查

设计模式(13)--Chain of Responsibility(责任链模式)--行为型

1.模式定义: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任. 2.模式特点: 责任链模式通过建立一条链来组织请求的处理者,请求将沿着链进行传递,请求发送者无须知道请求在何时.何处以及如何被处理,实现了请求发送者与处理者的解耦.在软件开发中,如果遇到有多个对象可

设计模式(一)Chain Of Responsibility责任链模式(未完成)

设计模式篇章,源于网课的学习,以及个人的整理 在我们接收用户提交的字符时,常常会使用到过滤,在学习责任链模式前,我们是这样做的 1.定义一个类 public class MsgProcesser { String msg; public MsgProcesser(String msg) { this.msg=msg; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg;

java设计模式(五)责任链模式

很多对象有每个对象对其下家的引用而连接起来形成一条链,请求在这条链上传递,直到链上某个对象决定处理此请求,应用场景如单位审批流程等. 要点:1)抽象处理者角色:定义处理请求接口及设定下家引用    2)具体处理着角色:具体处理请求或选择将请求传给下家 1.抽象处理者角色类,定义处理请求接口及下家引用 public abstract class PriceHandle { protected PriceHandle successor; public void setSuccessor(Price

PHP设计模式学习笔记: 责任链模式(Chain of Responsibility)

// 抽象书本类 abstract class AbstractBookTopic { abstract function getTopic(); abstract function getTitle(); abstract function setTitle($title_in); } // 书本类,继承自抽象书本类 class BookTopic extends AbstractBookTopic { private $topic; private $title; function __co

设计模式19:Chain Of Responsibility 职责链模式(行为型模式)

Chain Of Responsibility 职责链模式(行为型模式) 请求的发送者与接受者 某些对象请求的接受者可能有多种多样,变化无常…… 动机(Motivation) 在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者,如果显示指定,将必不可少地带来请求发送者与接受者的紧耦合. 如何使请求的发送者不需要指定具体的接受者?让请求的接受者自己在运行时决定来处理请求,从而使两者解耦. 意图(Intent) 使多个对象都有机会处理请求,从而避免请求的发送者和接受者

(20):(行为型模式) Chain Of Responsibility 职责链模式

(20):(行为型模式) Chain Of Responsibility 职责链模式,布布扣,bubuko.com

Chain of Responsibility - 职责链模式

定义 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合度. 案例 比如现在有一个图形界面,它包括一个应用Application类,一个主窗口Window,一个按钮Button,Window和Button都是继承自Widget类,现在在Button上按滑动鼠标滚轮,Button类不一定要处理,可能是Window类处理,也可能是是Application类处理,每一个类只处理自己关心的,从一个链式结构,以此查看是否要处理: 每一个对象都有处理事件的权利,当不处理的时候就会交给父对象处

Design Pattern Chain of Reponsibility 责任链模式

本程序实现一个责任链模式查询人名的资料. 开始都是查询第一个人,问其是否有某人的资料,如果有就返回结果,如果没有第一个人就会询问第二个人,第二个人的行为和第一个人的行为一致的,然后一致传递下去,直到找到答案,或者是最后没有资料,返回. 首先创建一个基类: //base class class Person { public: virtual void getInfo(string name) = 0; }; 第一个人的类: 主要行为函数是getInfor,就是一个if else判断,这里使用ma