zoukankan      html  css  js  c++  java
  • 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!
    ";
    	}
    };

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

    測试例如以下:

    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的回答。




  • 相关阅读:
    关于requests.exceptions.SSLError: HTTPSConnectionPool(host='XXX', port=443)问题
    python Requests库总结
    fiddler实现手机抓包及手机安装证书报错“无法安装该证书 因为无法读取该证书文件”解决方法
    django接口的工作原理
    postman+newman+jenkins 持续集成搭建及使用,实现接口自动化
    Jmeter之JDBC Request及参数化
    selenium+Python中的面试总结
    UI自动化测试:页面截图的3种方法
    selenium中通过location和size定位元素坐标
    Allure+pytest生成测试报告
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4274533.html
Copyright © 2011-2022 走看看