23種設計模式C++例項之責任鏈模式
阿新 • • 發佈:2019-02-10
#include <iostream>
using namespace std;
/*
* 責任鏈模式
* 很多物件由每一個物件對其下家的引用而連線起來形成一條鏈。
* 請求在這個鏈上傳遞,直到鏈上的某一個物件決定處理此請求。
* 發出這個請求的客戶端並不知道鏈上的哪一個物件最終處理這個請求,
* 這使得系統可以在不影響客戶端的情況下動態地重新組織和分配責任。
* */
/*
* 造完車之後需要把任務傳遞下去
* */
class CarHandle {
public:
CarHandle() {
m_handle = NULL;
}
virtual ~CarHandle() {}
virtual void handleRequset() = 0;
virtual CarHandle* setNextHandle(CarHandle* handle){
m_handle = handle;
return m_handle;
}
protected:
CarHandle* m_handle;// 下一個處理邏輯
};
class EngineCarHandle: public CarHandle {
public:
virtual void handleRequset() {
cout << "engine" << endl;
if (m_handle != NULL) {
m_handle ->handleRequset();
}
}
};
class BodyCarHandle: public CarHandle {
public:
virtual void handleRequset(){
cout << "body" << endl;
if (m_handle != NULL) {
m_handle ->handleRequset();
}
}
};
class TireCarHandle: public CarHandle {
public:
virtual void handleRequset(){
cout << "tire" << endl;
if (m_handle != NULL) {
m_handle ->handleRequset();
}
}
};
int main() {
CarHandle* engine = new EngineCarHandle;
CarHandle* body = new BodyCarHandle;
CarHandle* tire = new TireCarHandle;
// 呼叫順序寫死
engine->handleRequset();
body->handleRequset();
tire->handleRequset();
cout << endl;
// 可以設定執行順序
engine->setNextHandle(body);
body->setNextHandle(tire);
tire->setNextHandle(NULL);
engine->handleRequset();
delete tire;
delete body;
delete engine;
return 0;
}