概述
一个请求有多个对象可以处理,但每个对象的处理条件或权限不同。例如,公司员工请假,可批假的领导有部门负责人、副总经理、总经理等,但每个领导能批准的天数不同,员工必须根据自己要请假的天数去找不同的领导签名,也就是说员工必须记住每个领导的姓名、电话和地址等信息,这增加了难度。
定义
为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。
角色
Handler:
抽象处理者ConcreteHandler:
具体处理者Client:
客户类
场景
- 一个以上的对象可以处理一个请求,并且应该自动确定处理程序
- 您要向几个对象之一发出请求而无需明确指定接收者
- 应该动态指定可以处理请求的对象集
实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
//抽象处理者 class Handler { public: virtual ~Handler() {} virtual void setHandler(Handler * s) { successor = s; } virtual void handleRequest() { if (successor != nullptr) successor->handleRequest(); } //... private: Handler * successor; }; //具体处理者类1 class ConcreteHandler1 : public Handler { public: ~ConcreteHandler1() {} bool canHandle() { //... return false; } virtual void handleRequest() { if (canHandle()) { std::cout << "Handle by concrete handler 1" << std::endl; } else { std::cout << "cannot be handled by handler 1" << std::endl; Handler::handleRequest(); } //... } //... }; //具体处理者类2 class ConcreteHandler2 : public Handler { public: ~ConcreteHandler2() {} bool canHandle() { //... return true; } virtual void handleRequest() { if(canHandle()) std::cout << "handled by handler 2" << std::endl; else { std::cout << "cannot be handled by handler 2" << std::endl; Handler::handleRequest(); } //... } //... }; |
1 2 3 4 5 6 7 8 9 10 |
auto main()->int { ConcreteHandler1 handler1; ConcreteHandler2 handler2; handler1.setHandler(&handler2); handler1.handleRequest(); return 0; } |
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ 创建型:单例模式05/16
- ♥ 创建型:建造者模式09/21
- ♥ 创建型:原型模式09/25
- ♥ 设计模式:归类04/18
- ♥ 结构型:享元模式09/24
- ♥ 结构型:代理模式09/23