`

3. 行为型模式 (5) 责任链模式

阅读更多
3. 行为型模式 (5) 责任链模式

责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。

通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。

优点:
1. 降低耦合度。它将请求的发送者和接收者解耦。
2. 简化了对象。使得对象不需要知道链的结构。
3. 增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
4. 增加新的请求处理类很方便。

缺点:
1. 不能保证请求一定被接收。
2. 系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。
3. 可能不容易观察运行时的特征,有碍于除错。


1. 责任链模式

package com.andrew.pattern0305.chain.model01;
public abstract class AbstractLogger {
    public static int INFO = 1;
    public static int DEBUG = 2;
    public static int ERROR = 3;
    protected int level;
    protected AbstractLogger nextLogger;
    public void setNextLogger(AbstractLogger nextLogger) {
        this.nextLogger = nextLogger;
    }
    public void logMessage(int level, String message) {
        if (this.level <= level) {
            write(message);
        }
        if (nextLogger !=null) {
            nextLogger.logMessage(level, message);
        }
    }
    abstract protected void write(String message);
}


package com.andrew.pattern0305.chain.model01;
public class ConsoleLogger extends AbstractLogger {
    public ConsoleLogger(int level) {
        this.level = level;
    }
    @Override
    protected void write(String message) {
        System.out.println("Standard Console::Logger: " + message);
    }
}

package com.andrew.pattern0305.chain.model01;
public class ErrorLogger extends AbstractLogger {
    public ErrorLogger(int level) {
        this.level = level;
    }
    @Override
    protected void write(String message) {
        System.out.println("Error Console::Logger: " + message);
    }
}

package com.andrew.pattern0305.chain.model01;
public class FileLogger extends AbstractLogger {
    public FileLogger(int level) {
        this.level = level;
    }
    @Override
    protected void write(String message) {
        System.out.println("File Console::Logger: " + message);
    }
}


package com.andrew.pattern0305.chain.model01;
/**
 * 1. 责任链模式
 * 
 * @author andrew
 * @date 2018/08/15
 */
public class Client {
    private static AbstractLogger getChainOfLoggers() {
        AbstractLogger errorLogger = new ErrorLogger(AbstractLogger.ERROR);
        AbstractLogger fileLogger = new FileLogger(AbstractLogger.DEBUG);
        AbstractLogger consoleLogger = new ConsoleLogger(AbstractLogger.INFO);
        errorLogger.setNextLogger(fileLogger);
        fileLogger.setNextLogger(consoleLogger);
        return errorLogger;
    }
    public static void main(String[] args) {
        AbstractLogger loggerChain = getChainOfLoggers();
        loggerChain.logMessage(AbstractLogger.INFO, "This is an information.");
        loggerChain.logMessage(AbstractLogger.DEBUG, "This is an debug level information.");
        loggerChain.logMessage(AbstractLogger.ERROR, "This is an error information.");
    }
}
运行结果:
Standard Console::Logger: This is an information.
File Console::Logger: This is an debug level information.
Standard Console::Logger: This is an debug level information.
Error Console::Logger: This is an error information.
File Console::Logger: This is an error information.
Standard Console::Logger: This is an error information.


2. 责任链模式

package com.andrew.pattern0305.chain.model02;
public abstract class Handler {
    protected Handler successor;
    public abstract void handleRequest();
    public Handler getSuccessor() {
        return successor;
    }
    public void setSuccessor(Handler successor) {
        this.successor = successor;
    }
}


package com.andrew.pattern0305.chain.model02;
public class ConcreteHandler extends Handler {
    @Override
    public void handleRequest() {
        if (getSuccessor() != null) {
            System.out.println("放过请求");
            getSuccessor().handleRequest();
        } else {
            System.out.println("处理请求");
        }
    }
}


package com.andrew.pattern0305.chain.model02;
/**
 * 2. 责任链模式
 * 
 * @author andrew
 * @date 2018/08/15
 */
public class Client {
    public static void main(String[] args) {
        Handler handler1 = new ConcreteHandler();
        Handler handler2 = new ConcreteHandler();
        handler1.setSuccessor(handler2);
        handler1.handleRequest();
    }
}
运行结果:
放过请求
处理请求
分享到:
评论

相关推荐

    c++设计模式-行为型模式-责任链模式

    c++设计模式-行为型模式-责任链模式;qt工程;c++简单源码; 责任链(Chain of Responsibility)模式的定义:为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的...

    JAVA-设计模式-行为型模式-责任链模式

    JAVA-设计模式-行为型模式-责任链模式

    JAVA 设计模式 工厂模式 代理模式 迭代模式 责任链模式 源码

    4. **责任链模式**:责任链模式是行为型设计模式,它使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合。在这个模式中,请求沿着处理者链进行传递,每个处理者都有机会处理请求,或者将请求传递...

    23种设计模式,创建型模式共5种,结构型模式7种,行为型模式11种

    3. **责任链模式**:在对象链中传递请求,由链上的对象决定是否处理该请求,使得系统可以在不影响客户端的情况下动态调整责任分配。 4. **策略模式**:定义一组可互换的算法,并封装起来,使得它们可以相互替换,...

    设计模式_行为型_责任链模式.md

    责任链模式是一种行为型设计模式,用于处理程序中的请求。该模式通过建立一条链式结构,使得多个对象都有机会处理请求,从而达到解耦发送者和接收者的目的。在责任链模式中,请求沿着链从一个对象传递到下一个对象,...

    [行为型模式] 责任链模式的理解

    责任链模式是一种行为设计模式,它允许我们把请求沿着处理者链进行传递,直到某个处理者处理这个请求。这种模式让请求的发送者和接收者解耦,因为发送者无需知道哪个对象会处理请求,而接收者也无需知道请求来自哪里...

    设计模式3-行为型模式.doc

    7. **其他未详细展开的模式**:除了上述模式,还有其他行为型模式,如观察者模式、模板方法模式、访问者模式、状态模式等,它们各自解决了特定的编程问题,如事件通知、算法骨架、对象行为的动态变化等。 理解并...

    23种设计模式-行为型模式.docx

    在给定的文档中,提到了23种设计模式中的几种行为型模式,包括责任链模式、迭代器模式、中介者模式、命令模式、解释器模式、访问者模式、策略模式、模板方法模式、状态模式、观察者模式以及备忘录模式。下面将对这些...

    设计模式之行为型模式代码.zip

    责任链模式使得多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合。它将请求沿链传递,直到有对象处理它。比如在一个审批流程中,多个审批者组成一条链,请求从头到尾传递,直到找到合适的审批人...

    新版设计模式手册 通俗的例子讲述设计的方法 1创建型模式 2结构型模式 3 行为模式 详细的设计说明

    1. 责任链模式(Chain of Responsibility):将请求沿链传递,直到找到处理它的对象。 2. 命令模式(Command):将命令封装为对象,使得你可以参数化不同对象,同时支持命令的撤销和恢复。 3. 解释器模式...

    java设计模式之责任链模式

    责任链模式是软件设计模式中的一种行为模式,它允许在对象之间传递请求,同时让接收者决定是否处理这个请求。这种模式将请求的发送者和接收者解耦,使得多个对象都有机会处理一个请求,而无需显式指定具体的处理者。...

    基于Python的行为型模式设计.zip

    行为型模式是软件设计模式中的一个重要类别,它们主要关注对象之间的责任分配和交互。在Python编程语言中,我们可以利用这些模式来提高代码的可读性、可维护性和灵活性。本资料"基于Python的行为型模式设计.zip"包含...

    用Java实现23种设计模式

    3. 行为型模式 责任链模式(Chain of Responsibility Pattern) 命令模式(Command Pattern) 解释器模式(Interpreter Pattern) 迭代器模式(Iterator Pattern) 中介者模式(Mediator Pattern) 备忘录模式...

    设计模式的责任链模式的例子

    责任链模式(Chain of Responsibility Pattern)是设计模式中的一种行为模式,它的主要目的是将请求的发送者和接收者解耦,使得多个对象有机会处理这个请求,形成一条责任链。在这个链上,请求会沿着链传递,直到有...

    责任链模式例子

    在《Head First Design Patterns》文中是这么介绍责任链模式的,“通过责任链模式,你可以为某个请求创建一个对象链。每个对象依次检查此请求,并对其进行处理,或者将它传给链中的下一个...责任链模式属于行为型模式。

    Head.First设计模式_PDF

    3. 行为型模式:这类模式关注对象之间的交互和职责分配,包括策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、迭代器模式(Iterator)、命令模式(Command)、责任链模式(Chain ...

    设计模式实战代码-单例、简单工厂、策略、观察者、责任链、模板模式

    5. 责任链模式: 责任链模式允许将请求沿着处理者链传递,直到被某个处理者处理。每个处理者都可以处理请求,或者将请求传递给链中的下一个处理者。这种模式可以避免对象之间的耦合,提高系统的灵活性。 6. 模板...

    2 责任链模式-MOOC课程内容.pdf

    责任链模式是一种行为型设计模式,它通过构建一个对象链,使得一个请求能够沿着这个链传递,直到被链上的某个对象处理为止。该模式的主要目的是将请求的发送者和接收者解耦,即请求发送者不需要知道是谁处理了请求,...

    java的设计模式.对java设计模式的理解.

    行为型模式涉及对象之间的交互和职责分配,如观察者模式、模板方法模式、策略模式、命令模式、迭代器模式、访问者模式、备忘录模式、状态模式、解释器模式和责任链模式。 二、Java中的具体设计模式 1. 单例模式:...

Global site tag (gtag.js) - Google Analytics