目的:弱化发出请求的对象和处理请求对象的之间的关系
理解:每个处理请求的对象仅仅只关注自己能处理的请求,不关系其他请求
优点:
- 无需一个管理类来匹配所有的请求,更灵活
- 责任链可以动态的调整
- 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; }