设计模式--责任链模式(C++)

news/2024/5/19 15:36:38 标签: 责任链模式, c++, 开发语言

责任链模式就是对一批请求进行判断,是自己责任范围内的就处理,不是自己责任范围内的就传递给下一个负责人;比如有三个项目经理,顺序是A->B->C,把所有的项目都先传递给A,A拿到所有的项目后,把属于自己负责的项目留下来,把剩下的传递给B,然后B把属于自己的留下来,把不属于自己的再传递给C;

1.请求者接口基类

#pragma once
#include <string>
using namespace std;
class Female
{
public:
	Female(void);
	virtual ~Female(void);
	virtual int getType() = 0;
	virtual string getRequest() = 0;
private:

};

Female::Female()
{
}

Female::~Female()
{
}

1.1具体的请求者

#pragma once
#include "Female.h"
class Women:public Female
{
public:
	
	Women(int type,string request);
	~Women(void);
	int getType();
	string getRequest();
private:
	int mType;
	string mRequest;
};

Women::Women(int type, string request)
{
	this->mType = type;
	switch (this->mType)
	{
		case 1:
			this->mRequest.append(request);
			break;
		case 2:
			this->mRequest.append(request);
			break;
		case 3:
			this->mRequest.append(request);
			break;
	default:
		break;
	}
}

Women::~Women(void)
{
}

int Women::getType()
{
	return this->mType;
}

string Women::getRequest()
{
	return mRequest;
}

2.处理者基类

#pragma once
#include "Female.h"
class Handler
{
public:
	Handler(int type);
	virtual ~Handler(void);
	void HandleRequest(Female* pFemale);
	void SetNextHandler(Handler* next);
	virtual void ResponseRequest(Female* pFemale) = 0;
private:
	int mType;
	Handler* mpNextHandler;
};

Handler::Handler(int type):mType(type)
{
	mpNextHandler = nullptr;
}

Handler::~Handler(void)
{
}

void Handler::HandleRequest(Female* pFemale)
{
	if (pFemale->getType() == this->mType)
	{
		this->ResponseRequest(pFemale);
	}
	else
	{
		if (this->mpNextHandler != nullptr)
		{
			this->mpNextHandler->HandleRequest(pFemale);
		}
	}
}

void Handler::SetNextHandler(Handler* next)
{
	this->mpNextHandler = next;
}

2.1. 具体的处理者1

#pragma once
#include "Handler.h"
#include <iostream>
class Father:public Handler
{
public:
	Father(void);
	~Father(void);
	void ResponseRequest(Female* pFemale);
private:

};

Father::Father(void):Handler(1)
{
}

Father::~Father(void)
{
}

void Father::ResponseRequest(Female* pFemale)
{
	cout << "女儿向父亲请示:" << pFemale->getRequest() << endl;
	cout << "父亲回答:我不同意" << endl;
}

2.2 具体的处理者2

#pragma once
#include "Handler.h"
#include <iostream>
class Husband :public Handler
{
public:
	Husband(void);
	~Husband(void);
	void ResponseRequest(Female* pFemale);
private:

};

Husband::Husband(void) :Handler(2)
{
}

Husband::~Husband(void)
{
}

void Husband::ResponseRequest(Female* pFemale)
{
	cout << "老婆向老公请示:" << pFemale->getRequest() << endl;
	cout << "老公回答:同意" << endl;
}

2.3 具体的处理者3

#pragma once
#include "Handler.h"
#include <iostream>
class Son :public Handler
{
public:
	Son(void);
	~Son(void);
	void ResponseRequest(Female* pFemale);
private:

};

Son::Son(void) :Handler(3)
{
}

Son::~Son(void)
{
}

void Son::ResponseRequest(Female* pFemale)
{
	cout << "母亲向儿子请示:" << pFemale->getRequest() << endl;
	cout << "儿子回答:同意" << endl;
}

3.主程序



// 责任链模式.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include "Father.h"
#include "Women.h"
#include "Handler.h"
#include "Husband.h"
#include "Son.h"
#include "Female.h"

int main()
{
    Female* pDaughter = new Women(1, "我要和男朋友出去旅游");
    Female* pWife = new Women(2,"我要买个新包包");
    Female* pMother = new Women(3, "我要去跳广场舞");

    Handler* pFather = new Father();
    Handler* pHusband = new Husband();
    Handler* pSon = new Son();

    pFather->SetNextHandler(pHusband);
    pHusband->SetNextHandler(pSon);

    //父亲->老公->儿子
    pFather->HandleRequest(pDaughter);
    pFather->HandleRequest(pWife);
    pFather->HandleRequest(pMother);

    delete pDaughter;
    delete pWife;
    delete pMother;
    delete pFather;
    delete pHusband;
    delete pSon;

    system("pause");
    return 0;
}

4.结果

 


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

相关文章

Java字符中数据排序

思路 1、定义一个字符串 2、把字符串的数字数据存储到一个int类型的数组 3、对int数组进行排序 4、把排序后的int数组的元素进行拼接得到一个字符串&#xff0c;拼接采用StringBuilder来实现。 5、输出结果 代码示例 import java.util.Arrays;public class SortString {publi…

架构师给程序员的一封信

每次当我开始做新的东西是我就会很兴奋。就算在软件圈里做了20年以后&#xff0c;每当开始新的旅程里&#xff0c;我都觉得我心中有一些东西不吐不快。这是我们大家一起的旅程。我强烈地相信我们详细规划的过程是很有乐趣的&#xff0c;富有挑战的和丰富多彩的。我想让这个旅程…

VS添加QT资源显示文件位置无效

1.对Resources右键->添加->新建项 2. 选择Qt Resource File&#xff0c;并选择qrc所在的项目路径 3.创建成功之后&#xff0c;在所在项目路径下会有一个qrc文件 4. 接下来就可以在qrc中用Add Files添加图片资源了

Java 自动装箱和拆箱

装箱&#xff1a;把基本数据类型转为对应的包装类类型 拆箱&#xff1a;把包装类类型转为对应的基本数据类型 public static void main(String[] args) {//装箱&#xff1a;把基本数据类型转为对应的包装类类型Integer i Integer.valueOf(100);//自动装箱Integer ii 100;//In…

EDM营销邮件规范-制作-设计-[转]

EDM的设计要求&#xff1a; 1、邮件宽度&#xff1a;邮件的标准宽度为575像素&#xff0c;最宽不宜超过778像素&#xff0c;否则必须修改。 2、邮件的高度&#xff1a; 邮件的高度没有具体要求&#xff0c;应以邮件内容多少而定&#xff0c;建议最长不要超过1200像素&#xff0…

vm用nat方式访问外网及访问宿主机

2019独角兽企业重金招聘Python工程师标准>>> vm用nat方式访问外网 1&#xff0c;在windows上配置vmware network,只配置ip地址和子网掩码。例如&#xff1a;IP地址&#xff1a;192.168.2.1 子网掩码&#xff1a;255.255.255.0 2&#xff0c;在vm上的设置&#xff0…

Java:算法的时间复杂度比较

public class TimeDemo {public static void main(String[] args) {//获取开始时间long start System.currentTimeMillis();//算法测试int sum 0;int n 1000000000;for (int i 0; i < n; i) {sum i;}System.out.println(sum);//获取结束时间long end System.currentTi…

SQL 存储过程里读取表内容 游标fetch的使用

DECLARE Hid varchar(50), Hname varchar(50) declare contact_cursor cursor for --声明游标 select hotel_id,h_name from hotel where hotel_id<25open contact_cursor --打开游标 fetch next from contact_cursor into Hid,Hname --游标指针下移一行 while fetch_status…