惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Security Latest
Security Latest
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Stack Overflow Blog
Stack Overflow Blog
WordPress大学
WordPress大学
N
Netflix TechBlog - Medium
GbyAI
GbyAI
云风的 BLOG
云风的 BLOG
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
宝玉的分享
宝玉的分享
博客园 - 【当耐特】
C
Cyber Attacks, Cyber Crime and Cyber Security
雷峰网
雷峰网
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
T
Threat Research - Cisco Blogs
NISL@THU
NISL@THU
Spread Privacy
Spread Privacy
P
Proofpoint News Feed
J
Java Code Geeks
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
MyScale Blog
MyScale Blog
T
Tor Project blog
P
Proofpoint News Feed
C
CERT Recently Published Vulnerability Notes
P
Privacy & Cybersecurity Law Blog
MongoDB | Blog
MongoDB | Blog
Simon Willison's Weblog
Simon Willison's Weblog
C
Cybersecurity and Infrastructure Security Agency CISA
L
LINUX DO - 热门话题
小众软件
小众软件
G
GRAHAM CLULEY
P
Privacy International News Feed
AWS News Blog
AWS News Blog
Know Your Adversary
Know Your Adversary
P
Palo Alto Networks Blog
人人都是产品经理
人人都是产品经理
S
Schneier on Security
Scott Helme
Scott Helme
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
B
Blog RSS Feed
T
The Exploit Database - CXSecurity.com
Recent Announcements
Recent Announcements
E
Exploit-DB.com RSS Feed
C
CXSECURITY Database RSS Feed - CXSecurity.com
U
Unit 42
The Register - Security
The Register - Security
S
Securelist
Martin Fowler
Martin Fowler
Project Zero
Project Zero
大猫的无限游戏
大猫的无限游戏
Cisco Talos Blog
Cisco Talos Blog

博客园 - 鬼谷子com

2026年国内主流AI Coding Plan套餐全对比|开发者避坑指南 图解 | 你管这破玩意儿叫TCP?(转载) C++ static_cast、dynamic_cast、const_cast和reinterpret_cast(四种类型转换运算符) Qt内部的d指针和q指针手把手教你实现 C++中虚函数、虚继承内存模型 c++11新特性实战(二):智能指针 windows下使用mingw和msvc静态编译Qt5.15.xx Qt moc元对象编译器的原理和场景(反射) c++结构体内存对齐 c++11新特性实战 (一):多线程操作 抽象工厂模式(c++实现) 迭代器模式(c++实现) 中介者模式(c++实现) 享元模式(c++实现) 代理模式(c++实现) 状态模式(c++实现) - 鬼谷子com 建造者模式(c++实现) 命令模式(c++实现) 模板方法模式(c++实现)
职责链模式(c++实现)
鬼谷子com · 2020-07-15 · via 博客园 - 鬼谷子com

模式

模式定义

职责链模式(Chain of Responsibility),使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

模式动机

  • 当客户提交一个请求时,请求是沿链传递直至有一个ConcreteHandler对象负责处理它。

UML类图

源码实现

  • request.h
#include <string>

class Request
{
public:
    Request(std::string type, std::string content, int count);

    std::string Type();
    std::string Content();
    int Count();
private:
    std::string     m_Type;
    std::string     m_Content;
    int             m_Count;
};
  • request.cpp
#include "request.h"

Request::Request(std::string type, std::string content, int count)
    :m_Type(type),m_Content(content),m_Count(count)
{

}

std::string Request::Type()
{
   return m_Type;
}

std::string Request::Content()
{
    return m_Content;
}

int Request::Count()
{
    return m_Count;
}
  • manager.h
#include "request.h"

class Manager
{
public:
    Manager();
    virtual ~Manager();

    virtual void DoRequest(Request& request);
    void SetLastLevel(Manager* manager);

protected:
    Manager*        m_Last;
};
  • director.h
#include "manager.h"

class Director : public Manager
{
public:
    Director();
    void DoRequest(Request& request) override;
};
  • director.cpp
#include "director.h"
#include <iostream>

Director::Director()
{

}

void Director::DoRequest(Request &request)
{
    if(request.Type() == "请假" && request.Count() < 11)
    {
        std::cout << "总监批准请假" << std::endl;
    }
    else if(request.Type() == "加薪" && request.Count() < 1000)
    {
        std::cout << "总监批准加薪" << std::endl;
    }
    else
    {
        if(m_Last)
            m_Last->DoRequest(request);
    }
}
  • main.cpp
#include <iostream>
#include "managerp.h"
#include "director.h"
#include "generalmanagerp.h"
#include "request.h"

using namespace std;

int main()
{
    GeneralManagerP* gmp = new GeneralManagerP();
    Director* direcotr = new Director();
    ManagerP* mp = new ManagerP();

    direcotr->SetLastLevel(gmp);
    mp->SetLastLevel(direcotr);

    Request req1("请假", "小明要请假", 5);
    mp->DoRequest(req1);


    Request req2("请假", "小明要请假", 18);
    mp->DoRequest(req2);

    Request req3("加薪", "小红要请假", 500);
    mp->DoRequest(req3);

    Request req4("加薪", "小明要请假", 50000);
    mp->DoRequest(req4);
    return 0;
}
  • 运行结果

经理批准

总经理批准请假

总监批准加薪

优点

模式的优点

  • 接收者和发送者都没有对方的明确信息,且链中的对象自己也并不知道链的结构。结果是职责链可简化对象的互相连接,它们仅需保持一个指向其后继者的引用,而不需要保持它所有的候选接收者的引用。这也就大大降低了耦合度。
  • 可以随时的增加或修改处理一个请求的结构。增强了给对象指派职责的灵活性。

缺点

模式的缺点

  • 一个请求极有可能到了链的末端都得不到处理,或者因为没有正确配置而得不到处理。