`

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-设计模式-行为型模式-责任链模式

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

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

    用Java实现23种设计模式

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

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

    NULL 博文链接:https://jacky-dai.iteye.com/blog/2307068

    设计模式笔记(包含所有设计模式)个人总结提炼笔记

    3. 行为型模式:行为型模式关注对象之间的通信和协作,包括责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式和访问者模式。这些模式可以帮助...

    责任链模式例子

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

    06.设计模式.rar

    总体来说设计模式分为三大类:创建型模式,共五种:...行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

    设计模式之11个行为型模式

    行为型模式(BehavioralPattern)是对在不同的对象之间划分责任和算法的抽象化。行为型模式不仅仅关注类和对象的结构,而且重点关注它们之间的相互作用。在系统运行时,对象并不是孤立的,它们可以通过相互通信与协作...

    java 23种设计模式及具体例子

    * 责任链模式:责任链模式是一种行为型模式,它可以将对象之间的关系建立在责任链的基础上,以便于更好地实现对象之间的关系。 * 命令模式:命令模式是一种行为型模式,它可以将对象之间的关系建立在命令的基础上,...

    精品源码 C# 27种设计模式源代码

    8 责任链模式 9 创建型模式总结 9 中介者模式 10 备忘录模式 10 行为型模式总结 11 访问者模式 1 观察者模式 1 建造者模式 1 装饰模式 2 单例模式 2 门面模式 2 模板方法模式 3 策略模式 3 工厂方法模式 3 组合模式...

    责任链模式源码

    责任链模式(Chain of Responsibility)是一种结构简单的行为型模式,从一定程度上来说只有请求处理者对象这一种角色,其官方定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。...

    第17章_职责链模式.ppt

    行为型模式(Behavioral Pattern)是对在不同的对象之间划分责任和算法的抽象化。 行为型模式不仅仅关注类和对象的结构,而且重点关注它们之间的相互作用。 通过行为型模式,可以更加清晰地划分类与对象的职责,并研究...

    设计模式所有实验及实验报告及代码.zip

    29责任链模式 30状态模式 31观察者模式 32中介者模式 33迭代器模式 34访问者模式 35备忘录模式 36解释器模式 37UMLet的使用与类图的设计 38创建型模式应用实验 39结构型模式应用实验 40行为型模式应用实验 所有实验...

    23种设计模式 -设计模式图解.7z

    23种设计模式的特点定义、优缺点、使用场景,源码中...行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

    leetcode18java-StudyDayUp:基于java数据结构、算法、leetcode题目讲解,23种设计模式全面复习

    行为型模式 15. 模板方法模式 16. 策略模式 17. 命令模式 18. 责任链模式 19. 状态模式 20. 观察者模式 Observer模式 21. 中介者模式 22. 迭代器模式 23. 访问者模式 Visitor模式 24. 备忘录模式 25. 解释器模式 三...

    设计模式-C++

    创建型模式,共五种:工厂方法模式、抽象工厂模式、...行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

    软件设计模式知识点

    1. 责任链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。 2. 迭代器模式(Iterator):提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该...

    32设计模式.doc

    创建型模式,共五种:工厂方法模式、抽象工厂模式、...行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

    Java23种设计模式(总结)

    33 1.3 行为型模式 36 1.3.1 责任链模式 36 1.3.2 命令模式 39 1.3.3 解释器模式 42 1.3.4 迭代器模式 44 1.3.5 中介者模式 48 1.3.6 备忘录模式 51 1.3.7 观察者模式 53 1.3.8 状态模式 1.3.9 ...

Global site tag (gtag.js) - Google Analytics