设计模式-第二十章-职责链模式

一、UML图

二、包含的角色

Handler类,声明了所有具体处理者的通用接口。 该接口通常仅包含单个方法用于请求处理, 但有时其还会包含一个设置链上下个处理者的方法。

BaseHandler类,通常情况下, 该类中定义了一个保存对于下个处理者引用的成员变量。 客户端可通过将处理者传递给上个处理者的构造函数或设定方法来创建链。 该类还可以实现默认的处理行为: 确定下个处理者存在后再将请求传递给它。

ConcreteHandler类,

包含处理请求的实际代码。 每个处理者接收到请求后, 都必须决定是否进行处理, 以及是否沿着链传递请求。

处理者通常是独立且不可变的, 需要通过构造函数一次性地获得所有必要地数据。

三、特点

声明了所有具体处理者的通用接口。 该接口通常仅包含单个方法用于请求处理, 但有时其还会包含一个设置链上下个处理者的方法。

该模式能将多个处理者连接成一条链。 接收到请求后, 它会 “询问” 每个处理者是否能够对其进行处理。 这样所有处理者都有机会来处理请求

无论你以何种顺序将处理者连接成一条链, 所有请求都会严格按照顺序通过链上的处理者。

四、代码实现

Handler类

#pragma once

class Handler
{
public:
    virtual void SetNext(Handler *next_handler) = 0;
    virtual void Handle(int request) = 0;
};

BaseHandler类

#pragma once
#include "Handler.h"
#include <iostream>

class BaseHandler : public Handler
{
public:
    virtual void SetNext(Handler *next_handler) override
    {
        next_handler_ = next_handler;
    }

    virtual void Handle(int request) override
    {

        if (next_handler_ != nullptr)
        {
            next_handler_->Handle(request);
        }
        else
        {
          printf("BaseHandler handle \n");
        }
    }

private:
    Handler *next_handler_;
};

ConcreteHandler类,下面只实现一个。其他雷同。

#pragma once
#include "BaseHandler.h"
#include <iostream>

class ConcreteHandler1 : public BaseHandler
{
public:
    using BaseHandler::BaseHandler;
    virtual void Handle(int request) override
    {
        if (request == 1)
        {
            printf("concrete handler %d handle ! \n",request);
            return;
        }
        
        BaseHandler::Handle(request);
    }
};

main

#include "ConcreteHandler1.h"
#include "ConcreteHandler2.h"
#include "ConcreteHandler3.h"

int main() {
    Handler *h1 = new ConcreteHandler1();
    Handler *h2 = new ConcreteHandler2();
    Handler *h3 = new ConcreteHandler3();
    Handler *h4 = new BaseHandler();
    h1->SetNext(h2);
    h2->SetNext(h3);
    h3->SetNext(h4);

    std::cout << "-------request 1------";
    h1->Handle(1);
    std::cout << "-------request 2------";
    h1->Handle(2);

    delete h1;
    delete h2;
    delete h3;
    delete h4;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值