慢慢脱别吵醒她,爱主一回歌谱,王牌宠妃书包网
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系
让我来描述的话就是,现在我们有很多的对象可以处理一个事件,但这个事件的拥有者并不需要认识所有处理它事件的对象,这个时候就需要责任链模式来解决。
比如需要向公司请假,一天的假期只需要向组长申请就可以了,而一周甚至更长的假期则需要上级领导的批准。把这个例子写成代码:
class Manager { public: Manager(Manager *superior):m_superior(superior){} virtual bool deelWithLeave(int day) = 0; protected: Manager *m_superior; }; class GroupLeader : public Manager { public: GroupLeader(Manager *superior):Manager(superior){} virtual bool deelWithLeave(int day) { if(day <= 1) { cout << "组长批准请假" << day << "天"; return 1; } else//权限不够,向上级汇报 return m_superior->deelWithLeave(day); } }; class Director : public Manager { public: Director(Manager *superior):Manager(superior){} virtual bool deelWithLeave(int day) { if(day <= 7) { cout << "主任批准请假" << day << "天"; return 1; } else return m_superior->deelWithLeave(day); } }; class GeneralManager : public Manager { public: GeneralManager(Manager *superior):Manager(superior){} virtual bool deelWithLeave(int day) { cout << "总经理批准请假" << day << "天"; return 1; } };
使用
GeneralManager generalManager(nullptr); Director director(&generalManager); GroupLeader myLeader(&director); myLeader.deelWithLeave(20);
class LeaveHandler { public: bool deelWithLeave(int day) { if(day <= 1) cout << "向组长请假"; else if(day <= 7) cout << "向主任请假"; else cout << "向总经理请假"; } };
在公司的管理体制不会出现变化的情况下,这样做反而更好。
事实上在qt的事件系统中就使用了责任链模式,当一个点击事件产生时,它会在子控件和父控件之间传递来寻求处理方案。这里可能处理完后事件就被拦截,也可能处理完好继续交给下一位去处理,我们可以通过重载对应的事件函数或event函数来改写处理过程。
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
如何在没有core文件的情况下用dmesg+addr2line定位段错误
用QT制作3D点云显示器——QtDataVisualization
网友评论