zoukankan      html  css  js  c++  java
  • 设计模式:chain of responsibility模式

    目的:弱化发出请求的对象和处理请求对象的之间的关系

    理解:每个处理请求的对象仅仅只关注自己能处理的请求,不关系其他请求

    优点:

    • 无需一个管理类来匹配所有的请求,更灵活
    • 责任链可以动态的调整
    • Andorid中事件处理框架就使用了责任链模式

    继承关系图:

    例子:

    class Trouble
    {
    	int num;
    public:
    	Trouble(int num)
    	{
    		this->num = num;
    	}
    	
    	int getNum()
    	{
    		return num;
    	}
    };
    
    class Handler
    {
    	string name;
    	Handler* next;
    public:
    	Handler(string name)
    	{
    		this->name = name;
    		next = NULL;
    	}
    	
    	Handler* setNext(Handler* next)
    	{
    		this->next = next;
    		return next;
    	}
    	
    	void handler(Trouble* t)
    	{
    		if(resolve(t))
    		{
    			cout << "Trouble num = " << t->getNum() << " is solve by " << name << endl;
    		}
    		else if(next != NULL)
    		{
    			next->handler(t);
    		}
    		else
    		{
    			cout << "Trouble num = " << t->getNum() << " can't solve" << endl;
    		}
    	}
    	
    	virtual bool resolve(Trouble* t)
    	{
    		return false;
    	}
    };
    
    class LittleHandler: public Handler
    {
    public:
    	LittleHandler(string name) : Handler(name) 
    	{
    	}
    	
    	virtual bool resolve(Trouble* t)
    	{
    		bool ret = false;
    		
    		if(t->getNum() < 10)
    		{
    			ret = true;
    		}
    		
    		return ret;
    	}
    };
    
    class BiggerHandler: public Handler
    {
    public:
    	BiggerHandler(string name) : Handler(name) 
    	{
    	}
    	
    	virtual bool resolve(Trouble* t)
    	{
    		bool ret = false;
    		
    		if(t->getNum() > 10)
    		{
    			ret = true;
    		}
    		
    		return ret;
    	}
    };
    
    int main() 
    {
    	Handler* h = new Handler("handler");
    	LittleHandler* lh = new LittleHandler("littleHandler");
    	BiggerHandler* bh = new BiggerHandler("biggerHandler");
    	h->setNext(lh)->setNext(bh);
    	
    	Trouble* t1 = new Trouble(5);
    	h->handler(t1);
    	
    	Trouble* t2 = new Trouble(15);
    	h->handler(t2);
    	
    	return 0;
    }
  • 相关阅读:
    纯手写F3飞控的直升机固件(2.直升机倾斜盘混控了解)
    STM32输出PWM
    使用多个交叉编译器
    内核编译报错
    mdm9607平台2.2版本 编译指令
    linux 应用编程APIS
    linux 内核API总结
    Do away with the notion of hardsect_size
    大端 小端和网络字节序说明
    TI tlv320aic3104 codec调试之路径控制
  • 原文地址:https://www.cnblogs.com/chusiyong/p/11433833.html
Copyright © 2011-2022 走看看