设计模式13 - 职责链模式

作者:billy
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

职责链模式

责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。
在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。

使用场景

  • 多个对象可以处理同一个请求,但具体由哪个对象处理则在运行时动态决定。
  • 在请求处理者不明确的情况下向对个对象中的一个提交一个请求。
  • 需要动态处理一组对象处理请求。

优缺点

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

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

注意事项

责任链中一个处理者对象,其中只有两个行为,一是处理请求,二是将请求转送给下一个节点,不允许某个处理者对象在处理了请求后又将请求转送给上一个节点的情况。

UML结构图

在这里插入图片描述

代码实现

interface.h
创建抽象类 - 记录器;创建实体类 - 控制台记录器、错误记录器、文件记录器

#include <string>
#include <iostream>
using namespace std;

class AbstractLogger    //基类-记录器
{
public:
    static const int INFO = 1;
    static const int DEBUG = 2;
    static const int ERROR = 3;

    AbstractLogger() { nextLogger = nullptr; }
    virtual ~AbstractLogger() {}

    void setNextLogger(AbstractLogger *next) { nextLogger = next; }

    void logMessage(int level, string message)
    {
        if(this->level <= level)
        {
            write(message);
        }
        else
        {
            assert(nextLogger != nullptr);
            nextLogger->write(message);
        }
    }

    virtual void write(string message) = 0;

protected:
    int level;
    AbstractLogger *nextLogger; //责任链中的下一个元素
};

class ConsoleLogger: public AbstractLogger  //子类-控制台记录器
{
public:
    ConsoleLogger(int level)
    {
        this->level = level;
        cout << "init ConsoleLogger" << endl;
    }

    void write(string message)
    {
        cout << "Standard Console::Logger: " + message << endl;
    }

};

class ErrorLogger: public AbstractLogger    //子类-错误记录器
{
public:
    ErrorLogger(int level)
    {
        this->level = level;
        cout << "init ErrorLogger" << endl;
    }

    void write(string message)
    {
        cout << "Error Console::Logger: " + message << endl;
    }
};

class FileLogger: public AbstractLogger //子类-文件记录器
{
public:
    FileLogger(int level)
    {
        this->level = level;
        cout << "init FileLogger" << endl;
    }

    void write(string message)
    {
        cout << "File::Logger: " + message << endl;
    }
};

main.cpp
实例应用 - 根据logMessage函数来确定该对象是否有能力处理请求,
如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者

#include "interface.h"

int main()
{
    AbstractLogger *errorLogger = new ErrorLogger(AbstractLogger::ERROR);   //3
    AbstractLogger *fileLogger = new FileLogger(AbstractLogger::DEBUG);     //2
    AbstractLogger *consoleLogger = new ConsoleLogger(AbstractLogger::INFO);//1
    cout << endl;

    errorLogger->setNextLogger(fileLogger);
    fileLogger->setNextLogger(consoleLogger);

    errorLogger->logMessage(AbstractLogger::INFO, "This is an information");    //1
    errorLogger->logMessage(AbstractLogger::DEBUG, "This is an debug level information");   //2
    errorLogger->logMessage(AbstractLogger::ERROR, "This is an error information"); //3
    cout << endl;

    fileLogger->logMessage(AbstractLogger::INFO, "This is an information"); //1
    fileLogger->logMessage(AbstractLogger::DEBUG, "This is an debug level information");    //2
    fileLogger->logMessage(AbstractLogger::ERROR, "This is an error information");  //3

    return 0;
}

运行结果:
init ErrorLogger
init FileLogger
init ConsoleLogger

File::Logger: This is an information
File::Logger: This is an debug level information
Error Console::Logger: This is an error information

Standard Console::Logger: This is an information
File::Logger: This is an debug level information
File::Logger: This is an error information
  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值