码迷,mamicode.com
首页 > 其他好文 > 详细

Design Pattern Chain of Reponsibility 责任链模式

时间:2014-06-01 08:54:15      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:des   c   class   blog   code   a   

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

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


首先创建一个基类:

//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");
}

结果:

bubuko.com,布布扣

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




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

Design Pattern Chain of Reponsibility 责任链模式

标签:des   c   class   blog   code   a   

原文地址:http://blog.csdn.net/kenden23/article/details/27821961

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有 京ICP备13008772号-2
迷上了代码!