Design Pattern Chain of Reponsibility 责任链模式

本程序实现一个责任链模式查询人名的资料。

开始都是查询第一个人,问其是否有某人的资料,如果有就返回结果,如果没有第一个人就会询问第二个人,第二个人的行为和第一个人的行为一致的,然后一致传递下去,直到找到答案,或者是最后没有资料,返回。

首先创建一个基类:

//base class
class Person
{
public:
	virtual void getInfo(string name) = 0;
};

第一个人的类:

主要行为函数是getInfor,就是一个if else判断,这里使用map来保存数据,要查询的数据在map里面,那么返回结果,如果不在,那么就调用下一个person的getInfo函数,等于询问下一个人,如此循环下去

//derived help
class FirstPerson : public Person
{
	unordered_map<string, string> um_ss;
	Person *successor;
public:
	FirstPerson(Person *h) : successor(h), um_ss()
	{
		um_ss["Bill Gate"] = "Microsoft's founder";
		um_ss["Job Steve"] = "Apple's founder";
	}

	void getInfo(string name)
	{
		if (um_ss.count(name) )
		{
			cout<<"First person say: "<<name<<" is "<<um_ss[name]<<endl;
		}
		else successor->getInfo(name);
	}
};

第二个人和最后一个人的类如下:

class SecondPerson : public Person
{
	unordered_map<string, string> um_ss;
	Person *successor;
public:
	SecondPerson(Person *h) : successor(h), um_ss()
	{
		um_ss["Mark Zuckerberg"] = "Facebook's founder";
		um_ss["雷军"] = "小米's founder";
	}

	void getInfo(string name)
	{
		if (um_ss.count(name) )
		{
			cout<<"Second person say: "<<name<<" is "<<um_ss[name]<<endl;
		}
		else successor->getInfo(name);
	}
};

class FinalPerson : public Person
{
public:
	FinalPerson()
	{
	}

	void getInfo(string name)
	{
		cout<<"Final person say: "<<name<<" is "<<"not a famous name!\n";
	}
};

这样接口也是统一的,只需要问一个人就能得到答案了。

测试如下:

void ChainOfResponsibility_Run()
{
	FinalPerson finPer;

	SecondPerson secPer(&finPer);

	FirstPerson firPer(&secPer);

	firPer.getInfo("雷军");

	firPer.getInfo("You know who");

	firPer.getInfo("Bill Gate");
}

结果:

可以看到询问的都是第一个人的类,但是由于第一个人的类会调用自身的succssor,后继类,所以会可能得到第二个人Seconde person和最后一个人Final person的回答。

Design Pattern Chain of Reponsibility 责任链模式,布布扣,bubuko.com

时间: 2024-12-25 02:03:06

Design Pattern Chain of Reponsibility 责任链模式的相关文章

设计模式(13)--Chain of Responsibility(责任链模式)--行为型

1.模式定义: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链.请求在这个链上传递,直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任. 2.模式特点: 责任链模式通过建立一条链来组织请求的处理者,请求将沿着链进行传递,请求发送者无须知道请求在何时.何处以及如何被处理,实现了请求发送者与处理者的解耦.在软件开发中,如果遇到有多个对象可

Chain of Responsibility责任链模式(C++责任链模式)

Chainof Responsibility责任链模式:相当于MFC,windows程序设计窗口中的消息机制这类. MFC中,消息是通过一个向上递交的方式进行处理,例如一个WM_COMMAND消息的处理流程可能为: 1) MDI主窗口(CMDIFrameWnd)收到命令消息WM_COMMAND,其ID位ID_×××: 2) MDI主窗口将消息传给当前活动的MDI子窗口(CMDIChildWnd): 3) MDI子窗口给自己的子窗口(View)一个处理机会,将消息交给View: 4) View检查

设计模式(一)Chain Of Responsibility责任链模式(未完成)

设计模式篇章,源于网课的学习,以及个人的整理 在我们接收用户提交的字符时,常常会使用到过滤,在学习责任链模式前,我们是这样做的 1.定义一个类 public class MsgProcesser { String msg; public MsgProcesser(String msg) { this.msg=msg; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg;

java-设计模式(行为型)-【责任链模式】

1.Chain Of Responsibility(责任链模式) 定义:有多个对象,每个对象持有对下一个对象的引用,这样就会形成一条链,请求在这条链上传递, 直到某一对象决定处理该请求.但是发出者并不清楚到底最终那个对象会处理该请求. 此处强调一点就是,链接上的请求可以是一条链,可以是一个树,还可以是一个环,模式本身不约束这个, 需要我们自己去实现,同时,在一个时刻,命令只允许由一个对象传给另一个对象,而不允许传给多个对象. 优点:责任链模式可以实现,在隐瞒客户端的情况下,对系统进行动态的调整.

第 17 章 责任链模式【Chain of Responsibility Pattern】

以下内容出自:<<24种设计模式介绍与6大设计原则>> 中国古代对妇女制定了“三从四德”的道德规范,“三从”是指“未嫁从父.既嫁从夫.夫死从子”,也就是说一个女性,在没有结婚的时候要听从于父亲,结了婚后听从于丈夫,丈夫死了还要听儿子的,举个例子来说,一个女的要出去逛街,同样这样的一个请求,在她没有出嫁前她必须征得父亲的同意,出嫁之后必须获得丈夫的许可,那丈夫死了怎么办?一般都是男的比女的死的早,还要问问儿子是否允许自己出去逛街,估计你下边马上要问要是没有儿子怎么办?请示小叔子.侄子

责任链模式 职责链模式 Chain of Responsibility Pattern 行为型 设计模式(十七)

责任链模式(Chain of Responsibility Pattern) 职责链模式 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系 将这些对象连接成一条链,并沿着这条链传递请求,直到有一个对象处理它为止. 责任链模式中,每个对象通过持有对下家的引用而链接起来,形成一条链条,串联起来多个处理对象. 在责任链模式中,请求在链上进行传递,直到链上的某一个对象决定处理此请求. 发出这个请求的客户端程序并不知道到底是哪一个对象具体的处理了请求 这使得系统可以在不影响客户

24种设计模式--责任链模式【Chain ofResponsibility Pattern】

中国古代对妇女制定了“三从四德”的道德规范,“三从”是指“未嫁从父.既嫁从夫.夫死从子”,也就是说一个女性,在没有结婚的时候要听从于父亲,结了婚后听从于丈夫,丈夫死了还要听儿子的,举个例子来说,一个女的要出去逛街,同样这样的一个请求,在她没有出嫁前她必须征得父亲的同意,出嫁之后必须获得丈夫的许可,那丈夫死了怎么办?一般都是男的比女的死的早,还要问问儿子是否允许自己出去逛街,估计你下边马上要问要是没有儿子怎么办?请示小叔子.侄子等等,在父系社会中,妇女只占从属地位,现在想想中国的妇女还是比较悲惨的

责任链模式(Chain of Responsibility Pattern)

责任链模式:可以为某个请求创建一个对象链.每个对象依序检查此请求,并对其处理,或者把它传给链中的下一个对象. 责任链上的对象负责处理请求,客户只需要将请求发送到责任链上即可,无需关心处理的细节和请求的传递,所以请求的发送者和接收者解耦了. 类图: 具体例子: 一个Logger日志抽象类,三个具体日志类继承Logger,责任链的顺序是HighestLogger->MiddleLogger->OrdinaryLogger()(顺序是自己定的,可以从高级到低级也可以低级到高级,看具体实现) 为了判断

责任链模式(Chain of Responsibility)

一:定义     使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这个条链传递请求,直到有对象处理它为止.   二:<设计模式之禅>和<Design Pattern GoF>的介绍,责任链模式是有且只有一个对象处理请求.我认为下面的例子可以理解为责任链模式的一个变种, 它也是沿着一个对象链传递请求, 但是不止一个对象最终对请求做出了响应,但是在链的前面的对象有权利选择是否继续往后传递请求.     假设android界面的一个&