浅谈设计模式:责任链模式(Chain Of Responsibility)

热爱生活、享受娱乐、专注技术,欢迎关注微信公众号QGer,我们一起见证成长!

什么是责任链模式?

官方解释: avoid coupling the sender of a request to its receiver by giving multiple objects a chance to handle the request。

使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。

  • 通俗解释:一个执行命令可能被多个对象处理,为避免发送命令者和接收(处理)命令者之间具有比较复杂的关联,将这多个处理的对象当作一条责任链中的一个个结点,并使请求命令经过该责任链,这些结点都有机会处理请求。

为什么使用责任链模式?

  • 发送命令者与接受命令者解耦,若不加以包装,可能一种命令要对应一种处理命令的对象,这样一发送者与接收命令者之间关联变得复杂,形成了强耦合关系。这对与系统的拓展并没有好处。将命令处理对象拼接成一条处理命令的责任链,使得发送者与接受者形成弱关联,降低耦合性,易于拓展。
  • 命令处理对象之间的链接通过继承者(successor)来实现,使得节点的顺序可灵活变化,并不需要固定一个顺序。
  • 当在对象中分派职责时,职责链给你更多的灵活性。你可以通过在运行时刻对该链进行动态的增加或修改来增加或改变处理一个请求的那些职责。你可以将这种机制与静态的特例化处理对象的继承机制结合起来使用。

如何使用责任链模式?

责任链模式的UML图如下:

各个组件解释:

  • Client:命令的发送者。
  • Handler:抽象的命令处理器,定义了处理命令的抽象接口,内聚了一个Handler作为继承者(Successor)。
  • ConcreteHandler:具体的命令处理器,实现了处理命令的方法,并确定了当某个命令并不需要自己处理时,下一个处理该命令的继承者是谁。

使用范围:

  1. 多个对象可以处理一个请求
  2. 命令发送者与接受者之间的关系不想明确指定时,即命令对象希望被发送到一组命令处理器中而并不显示指定其接收器
  3. 处理某个指令的对象必须动态指定

纯与不纯责任链:

  • 有一种说法,纯的责任链的命令处理节点只需要做到:处理该命令并返回、不处理该命令并传递。即命令可能传递到应该处理的那个节点后中断传递。
  • 不纯的责任链的命令处理节点则是这样:处理该命令并传递、不处理该命令并传递。即命令一定会传递完整条责任链,其中的所有节点都有可能对该命令进行响应并处理。可能一个节点处理,也可能多个节点处理。Servlet的Filter便是采用了这种设计结构。
  • 个人认为,并没有所谓纯与不纯之说,主要看你需要哪一种实现方案,说到底责任链仅仅是提供一个命令处理的包装,使得代码更加整洁,系统更加容易拓展。

应用实例:

现在我们有这么一个需求,我想实现一个文本解析的功能,文件File充当命令,不同后缀格式的文件需要用不同的解析器(接受者)进行解析,那么我们可以这样:

1、定义一个抽象的解析器类,实现了公有的方法,以及声明了解析文件的抽象方法。

public abstract class Parser {
    private Parser successor;
    protected String fomat;
    public void transfer(File file) {
        if (getSuccessor() != null) {
            getSuccessor().parse(file);
        } else {
            System.out.println("不能找到解析该文本的相关处理器");
        }
    }
    public abstract void parse(File file);
    protected boolean canParseFile(File file) {
        return (file != null) && (file.getName().endsWith(this.fomat));
    }
    public void setFomat(String fomat) {
        this.fomat = fomat;
    }
    public Parser getSuccessor() {
        return successor;
    }
    public void setSuccessor(Parser successor) {
        this.successor = successor;
    }
}

2、定义具体的解析器, 当文件属于自身解析的范畴时,进行解析,否则传递给继承者。

public class TextParser extends Parser {
    public TextParser(Parser successor) {
        setFomat("txt");
        setSuccessor(successor);
    }
    @Override
    public void parse(File file) {
        if (canParseFile(file)) {
            System.out.println(file.getName() + "文本文件解析成功");
        } else {
            super.transfer(file);
        }
    }
}
public class XmlParser extends Parser {
    public XmlParser() {
        setFomat("xml");
    }
    @Override
    public void parse(File file) {
        if (canParseFile(file)) {
            System.out.println(file.getName() + "XML文件解析成功");
        } else {
            super.transfer(file);
        }
    }
}

3、在客户端中定义责任链中的解析器的前后顺序。此处简明起见为:Text->Xml。

public class client {
    public static void main(String[] args) {
        XmlParser xmlParser = new XmlParser();
        TextParser textParser = new TextParser(xmlParser);
        textParser.parse(new File("test.xml"));
    }
}
  • 此处可拓展地方为:1、可灵活增加解析器 2、继承者的初始化可不在构造方法中而使用setter方法 3、根据需求可将本结构改为一个文件解析多重文本格式的功能,即如上所说的“不纯”的责任链,具体细节各位可以自己研究一下。
时间: 2024-10-07 09:54:26

浅谈设计模式:责任链模式(Chain Of Responsibility)的相关文章

[设计模式] 责任链模式 Chain of Responsibility

转    http://blog.csdn.net/wuzhekai1985   http://www.jellythink.com/archives/878 向项目经理提交了休假申请,我的项目经理向项目主管提交了我的休假申请,项目主管向部门经理提交了我的休假申请:最后,部门经理同意了我的休假申请.是的,一个简单的休假申请,需要这么复杂的流程,这也是一个公司保证它正常运行的必要.如果部门经理休假了,那么我的休假申请由谁审批呢?这个时候由项目主管代替部门经理进行审批.一个休假申请的审批制度有着严格

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

概括 名称 Chain of Responsibility 结构 动机 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 适用性 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定. 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求. 可处理一个请求的对象集合应被动态指定. 解析 形象比喻: 晚上去上英语课, 为了好开溜坐到了最后一排, 哇, 前面坐了好几个漂亮的MM 哎

责任链模式-Chain of Responsibility(Java实现), 例1

责任链模式-Chain of Responsibility, 例1 在这种模式中,通常每个接收者都包含对另一个接收者的引用.如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推. Trouble类 本类是:待责任链来处理的问题Trouble类. 本例子较简单, Trouble只有一个int型作为待处理的编号. public class Trouble { private int number; public Trouble(int number) { this.number

设计模式之二十:责任链模式(Chain of Responsibility)

感觉这个设计模式和组合模式一样是一种非常巧妙的设计模式,在须要使用它的地方假设不使用这样的设计模式代码会变的非常复杂,可是这样的设计模式的基本原理又是非常easy的. 责任链模式: 通过使多个对象都有机会来处理请求的方式避免了请求的发送者和接收者之间的耦合.将接收者组织成链式的结构这样能够将请求沿着这条链进行传递,直到有接收者对它进行处理. UML类图: 主要包含: Handler:定义了一个处理请求的接口,实现了定义后继者的方法. ConcreteHandler:处理各自负责的请求,假设不能处

设计模式 笔记 责任链模式 chain of responsibility

//---------------------------15/04/25---------------------------- //Chain of responsibility 责任链-----对象行为型模式 /* 1:意图: 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象 连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 2:动机: 3:适用性: 1>有多个对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定. 2>你想在不明确指定

B5:责任链模式 Chain Of Responsibility

使多个对象都有机会处理处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着该链处理请求,直到有一个对象能够处理它为止. UML 示例代码: abstract class Handle { protected $nextHandle; public function setNextHandle(Handle $handle) { $this->nextHandle = $handle; } abstract public function handleRequest(

责任链模式(Chain of responsibility pattern)

鲁春利的工作笔记,好记性不如烂笔头 本文出自 "闷葫芦的世界" 博客,请务必保留此出处http://luchunli.blog.51cto.com/2368057/1892886

设计模式-责任链模式

1 模式动机 为了降低系统的耦合度,将事件请求者和接收者解耦,我们可以使用命令模式来设计系统.通过增加不同的命令对象,不仅可以解耦,也可以有效解决发送和接收处理速度不一样的问题. 2 模式定义 责任链模式(Chain of Responsibility Pattern):将多个对象连成一条链,沿着这条链传递请求,直到有一个对象处理它为止,使得多个对象都有机会处理该请求. 3 模式分析 Handler处理者接口: 声明处理请求的接口. ConcreteHandler具体处理者类: 实现处理请求的接

责任链模式 职责链模式 Chain of Responsibility Pattern 行为型 设计模式(十七)

责任链模式(Chain of Responsibility Pattern) 职责链模式 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系 将这些对象连接成一条链,并沿着这条链传递请求,直到有一个对象处理它为止. 责任链模式中,每个对象通过持有对下家的引用而链接起来,形成一条链条,串联起来多个处理对象. 在责任链模式中,请求在链上进行传递,直到链上的某一个对象决定处理此请求. 发出这个请求的客户端程序并不知道到底是哪一个对象具体的处理了请求 这使得系统可以在不影响客户

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

atitit.设计模式(1)---职责链模式(chain of responsibility)最佳实践O7 日期转换 1. 需求:::日期转换 1 2. 可以选择的模式: 表格模式,责任链模式 1 3. 调用代码 2 4. 责任链链的特性: 2 5. 模式结构 4 6. 职责链模式包含如下角色:Handler,ConcreteHandler: 具体处理者,HandlerChainUtil ,Client 4 7. 设置哈一个handler,,两个法:排序法,指定法 5 1. 指定法 5 2. 排