责任链模式

来源:互联网 发布:sql server许可模式 编辑:程序博客网 时间:2024/05/06 12:19

1、概念:

使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象链成一条链,并沿着这条链传递该请求/命令,直到有对象处理它为止

注:这里的请求、命令正是可以和命令模式进行结合的地方,实际上就是利用链表把对象一个链上下一个对象。

2、角色和职责:

    

                    Handler:

                                   处理类的抽象父类

                   ConcreteHandler:

                                 具体的处理类

3、示例代码:

// 责任链模式上// 造车问题抛出,这段代码不是责任链模式,而是责任链模式的抛出#include<iostream>using  namespace std;// 造车抽象类class CarHandle{public :virtual void HandleCar() = 0;    // 造车抽象类接口};// 造车头class HeadCarHandle:public CarHandle{public:virtual void HandleCar(){cout << "造车头" << endl;}};// 造车身class BodyCarHandle:public CarHandle{public:virtual void HandleCar(){cout << "造车身" << endl;}};// 造车尾class TailCarHandle:public CarHandle{public:virtual void HandleCar(){cout << "造车尾" << endl;}};int main(void){HeadCarHandle *headcarhandle = new HeadCarHandle;BodyCarHandle *bodycarhandle = new BodyCarHandle;TailCarHandle *tailcarhandle = new TailCarHandle;headcarhandle->HandleCar();bodycarhandle->HandleCar();tailcarhandle->HandleCar();delete headcarhandle;delete bodycarhandle;delete tailcarhandle;return 0;}// 责任链模式 下#include<iostream>using namespace std;// 造车抽象类class CarHandle{public:virtual void HandleCar() = 0;    // 造车抽象类接口CarHandle *setNextHandle(CarHandle *handle){m_carhandle = handle;return m_carhandle;}protected:CarHandle *m_carhandle;// 保存下一个数据吹单元};// 造车头class HeadCarHandle :public CarHandle{public:virtual void HandleCar(){cout << "造车头" << endl;// 造完车头以后 把任务递交给下一个处理者if (m_carhandle!=NULL){m_carhandle->HandleCar();}}};// 造车身class BodyCarHandle :public CarHandle{public:virtual void HandleCar(){cout << "造车身" << endl;// 造完车身以后 把任务递交给下一个处理者if (m_carhandle != NULL){m_carhandle->HandleCar();}}};// 造车尾class TailCarHandle :public CarHandle{public:virtual void HandleCar(){cout << "造车尾" << endl;// 造完车身以后 把任务递交给下一个处理者if (m_carhandle != NULL){m_carhandle->HandleCar();}}};int main(void){HeadCarHandle *headcarhandle = new HeadCarHandle;BodyCarHandle *bodycarhandle = new BodyCarHandle;TailCarHandle *tailcarhandle = new TailCarHandle;// 任务对的处理关系headcarhandle->setNextHandle(tailcarhandle);tailcarhandle->setNextHandle(bodycarhandle);bodycarhandle->setNextHandle(NULL);headcarhandle->HandleCar();delete headcarhandle;delete bodycarhandle;delete tailcarhandle;return 0;}



原创粉丝点击