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

news/2024/5/19 14:50:36 标签: 设计模式, 责任链模式

一、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;
}

http://www.niftyadmin.cn/n/1243598.html

相关文章

【我的Android进阶之旅】 RxJava 理解Backpressure并解决异常 rx.exceptions.MissingBackpressureException

今天测试人员在测试应用APP的时候应用crash了,查看了下crash log如下所示: java.lang.IllegalStateException: Exception thrown on Scheduler.Worker thread. Add `onError` handling.at rx.android.schedulers.LooperScheduler$ScheduledAction.run(LooperScheduler.java:…

设计模式-第十九章-命令模式

一、UML图 二、包含的角色 Invoker类&#xff0c;类负责对请求进行初始化&#xff0c; 其中必须包含一个成员变量来存储对于命令对象的引用。 发送者触发命令&#xff0c; 而不向接收者直接发送请求。 注意&#xff0c; 发送者并不负责创建命令对象&#xff1a; 它通常会通过…

设计模式-第十六章-迭代器模式

一、UML图 二、包含的角色 Iterator 接口&#xff0c;声明了遍历集合所需的操作&#xff1a; 获取下一个元素、 获取当前位置和重新开始迭代等。 IteratorCollection接口&#xff0c;声明一个或多个方法来获取与集合兼容的迭代器。 请注意&#xff0c; 返回方法的类型必须被声…

一次因为文件名开头包含空格而导致FTP文件一直无法下载的悲剧!

最近负责公司研究新的多渠道打包方案&#xff0c;之前的打包方案太慢了&#xff0c;因此采用了美团的Android Signature V2 Scheme签名下的新一代渠道包打包神器 方案进行了多渠道打包。但是由于马虎&#xff0c;在配置多渠道打包定制渠道包的APK的文件名称的时候&#xff0c;在…

设计模式-第二十一章-中介者模式

一、UML图 二、包含的角色 Mediator接口&#xff0c;声明了与组件交流的方法&#xff0c; 但通常仅包括一个通知方法。 组件可将任意上下文 &#xff08;包括自己的对象&#xff09; 作为该方法的参数&#xff0c; 只有这样接收组件和发送者类之间才不会耦合。 Component基类…

为你的CSDN博客添加CNZZ流量统计功能

一、流量统计介绍 流量统计是指通过各种科学的方式&#xff0c;准确的纪录来访某一页面的访问者的流量信息&#xff0c;目前而言&#xff0c;必须具备可以统计。 1、简介 统计独立的访问者数量&#xff08;独立用户、独立访客&#xff09;&#xff1b;可以统计独立的IP地址数量…

设计模式-第十四章-备忘录模式

一、UML图 二、包含的角色 Memento类&#xff0c; 是原发器状态快照的值对象 &#xff08;value object&#xff09;。 通常做法是将备忘录设为不可变的&#xff0c; 并通过构造函数一次性传递数据。 Originator类可以生成自身状态的快照&#xff0c; 也可以在需要时通过快照…

【我的Android进阶之旅】Android目录过长造成错误:Failed to crunch file abc_textfield_search_activated_mtrl_alpha.9.png

一、编译异常描述 一大早来开发一个新的需求,拉取了一个新的分支,然后导入Android Studio之后,编译就报错了,报错如下所示: 错误具体日志如下所示: Information:Gradle tasks [:app:assembleDebug] Error:Failed to crunch file C:\Code\XTC_NetEaseCloudMusic\bran…