设计模式_18 责任链模式(含 UML图 和 C++代码)

news/2024/5/19 11:49:52 标签: 责任链模式, c++, 设计模式

设计模式_18 责任链模式

  • 18 责任链模式
    • 18.1 概念
    • 18.2 结构
    • 18.3 实现
      • 18.3.1 UML图
      • 18.3.2 代码
    • 18.4 优缺点
      • 18.4.1 优点
      • 18.4.2 缺点
  • return 设计模式概述;

18 责任链模式

18.1 概念

为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一对象的引用而连成一条链。有请求发生时,可将请求沿着这条链传递,直到有对象处理为止。

18.2 结构

抽象处理者角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。
具体处理者角色:实现抽象处理者的处理方法,判断是否能够处理本次请求,可以则处理,否则将请求转给后继者。
客户类角色:创建处理链,并向链头的具体处理者对象提交请求,不关心处理细节和具体的传递过程。

18.3 实现

18.3.1 UML图

在这里插入图片描述

18.3.2 代码

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

class LeaveRequest {
private:
	string name;
	int num;
	string content;
public:
	LeaveRequest(string name, int num, string content) {
		this->name = name;
		this->num = num;
		this->content = content;
	}
	string getName() {
		return this->name;
	}
	int getNum() {
		return this->num;
	}
	string getContent() {
		return this->content;
	}
};

class Handler {
protected:
	int maxNum;
	Handler* nextHandler = nullptr;
public:
	Handler(int maxNum) {
		this->maxNum = maxNum;
	}
	void setNextHandler(Handler* nextHandler) {
		this->nextHandler = nextHandler;
	}
	virtual void handleLeave(LeaveRequest* request) = 0;
};

class HandlerLevelOne : public Handler {
public:
	HandlerLevelOne(int maxNum) : Handler(maxNum) {}
	void handleLeave(LeaveRequest* request) {
		if (request->getNum() > this->maxNum) {
			nextHandler->handleLeave(request);
		}
		else {
			cout << "One级别批准 " << endl;
			cout << "姓名:" << request->getName() << endl;
			cout << "天数:" << request->getNum() << endl;
			cout << "原因:" << request->getContent() << endl;
		}
	}
};

class HandlerLevelTwo : public Handler {
public:
	HandlerLevelTwo(int maxNum) : Handler(maxNum) {}
	void handleLeave(LeaveRequest* request) {
		if (request->getNum() > this->maxNum) {
			nextHandler->handleLeave(request);
		}
		else {
			cout << "Two级别批准:" << endl;
			cout << "姓名:" << request->getName() << endl;
			cout << "天数:" << request->getNum() <<endl;
			cout << "原因:" << request->getContent()<< endl;
		}
	}
};

class HandlerLevelThree : public Handler {
public:
	HandlerLevelThree(int maxNum) : Handler(maxNum) {}
	void handleLeave(LeaveRequest* request) {
		if (request->getNum() > this->maxNum) {
			cout<<"不批准" << request->getName() <<"的假期" << endl;
		}
		else {
			cout << "Three级别批准 " << endl;
			cout << "姓名:" << request->getName() << endl;
			cout << "天数:" << request->getNum() << endl;
			cout << "原因:" << request->getContent() << endl;
		}
	}
};
int main() {
	Handler* one = new HandlerLevelOne(3);
	Handler* two = new HandlerLevelTwo(7);
	Handler* three = new HandlerLevelThree(30);
	one->setNextHandler(two);
	two->setNextHandler(three);
	LeaveRequest* request = new LeaveRequest("张三", 10, "探亲");
	one->handleLeave(request);
	request = new LeaveRequest("李四", 360, "度假");
	one->handleLeave(request);
	return 0;
}

18.4 优缺点

18.4.1 优点

降低了对象之间的耦合度。
增强了系统的可扩展性。可以根据需要增加新的请求处理类,满足开闭原则。
增强了给对象指派职责的灵活性。当工作流程发生变化,可以动态修改链内成员或责任顺序。
简化了对象之间的连接。一个对象只保持一个指向其后继的引用。
责任分担。每个类只需要负责自己该处理的工作,不能处理则传递给下一个,符合单一职责原则。

18.4.2 缺点

不能保证每个请求一定会被处理。
对比较长的职责链,处理请求可能涉及多个对象,影响系统性能。
职责链建立的合理性需要客户端保证,增加了客户端的复杂性。职责链设置错误可能会导致循环调用。

return 设计模式概述;

返回设计模式概述


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

相关文章

设计模式_19 状态模式(含 UML图 和 C++代码)

设计模式_19 状态模式19 状态模式19.1 概念19.2 结构19.3 实现19.3.1 UML图19.3.2 代码19.3.3 测试结果19.4 优缺点19.4.1 优点19.4.2 缺点19.5 使用场景return 设计模式概述;19 状态模式 加油&#xff0c;你可以的。&#xff08;PS&#xff1a;状态模式给我整吐了&#xff0c…

设计模式_20 观察者模式(含 UML图 和 C++代码)

设计模式_20 观察者模式20 观察者模式20.1 概念20.2 结构20.3 实现20.3.1 UML图20.3.2 代码20.4 优缺点20.4.1 优点20.4.2 缺点20.5 使用场景return 设计模式概述;20 观察者模式 20.1 概念 又被称为发布-订阅模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;让多个…

设计模式_21 中介者模式

设计模式_21 中介者模式21 中介者模式21.1 概念21.2 结构21.3 实现21.3.1 UML图21.3.2 代码21.4 优缺点21.4.1 优点21.4.2 缺点21.5 使用场景return 设计模式概述;21 中介者模式 21.1 概念 定义一个中介角色来封装一系列对象之间的交互&#xff0c;使原有对象之间耦合松散&am…

设计模式_22 迭代器模式

设计模式_22 迭代器模式22 迭代器模式22.1 概念22.2 结构22.3 实现22.3.1 UML图22.3.2 代码22.4 优缺点22.4.1 优点22.4.2 缺点22.5 使用场景return 设计模式概述;22 迭代器模式 22.1 概念 提供一个对象来顺序访问聚合对象中的一系列数据&#xff0c;而不暴露聚合对象内部表示…

设计模式_23 访问者模式

设计模式_23 访问者模式23 访问者模式23.1 概念23.2 结构23.3 实现23.3.1 UML图23.3.2 代码23.4 优缺点23.4.1 优点23.4.2 缺点23.5 使用场景23.6 分派23.6.1 定义23.6.2 双分派return 设计模式概述;23 访问者模式 23.1 概念 封装了一些作用于某种数据结构中的各元素的操作&a…

设计模式_24 备忘录模式

设计模式_24 备忘录模式24 备忘录模式24.1 概念24.2 结构24.3 实现24.3.1 白箱备忘录模式24.3.1.1 UML图24.3.1.2 代码24.3.2 黑箱备忘录模式24.3.2.1 UML图24.3.2.2 代码24.4 优缺点24.4.1 优点24.4.2 缺点24.5 使用场景return 设计模式概述;24 备忘录模式 24.1 概念 存档&a…

Git的指令

git的使用本地操作常用指令版本提交版本回退忽略列表分支指令常用分支远程仓库SSH公钥配置远程仓库操作从远程仓库中克隆从远程仓库中抓取和拉取本地操作 常用指令 版本提交 git init //创建仓库 touch xxx.xx //创建文件 vi xxx.xx //修改文件 git status //查看状态…

pyecharts在数据可视化中的应用

pyecharts在数据可视化中的应用 使用pyecharts进行数据可视化 安装 pip install pyecharts 也可以在pycharm软件里进行下载pyecharts库包。 下载成功后进行查询版本号 import pyecharts print(pyecharts.__version__)pyecharts的中文官网 可以查看pyecharts的中文官网介绍htt…