設計模式《十五》——責任鏈模式

簡介

       責任鏈模式(Chain of Responsibility Pattern)爲請求創建了一個接收者對象的鏈。每個對象持有對下一個對象的引用,這樣就會形成一條鏈,請求在這條鏈上傳遞,直到某一對象決定處理該請求。這種模式給予請求的類型,對請求的發送者和接收者進行解耦。

角色與職責

Handler:處理請求的接口,接口中定義一個方法,以設定和返回對下一家的引用。

ConcreteHandler:具體處理者接到請求後,可以選擇將請求處理掉,也可以將請求傳給下家。

實現

#include <iostream>
using std::cout;
using std::endl;
using std::cin;
// 完成當前任務,需要把任務傳遞給下去
struct CarHandler {
public:
    virtual void HandlerCar() = 0;
    CarHandler* setNextHandler(CarHandler* handler) {
        m_handler = handler;
        return m_handler;
    }
protected:
    CarHandler* m_handler;
};
class HeadCarHandler : public CarHandler {
public:
    virtual void HandlerCar() {
        cout << "造車頭" << endl;
        // 造完車頭以後把任務傳遞給下一個執行者。
        if (m_handler != NULL) {
            m_handler->HandlerCar();
        }
    }
};
class BodyCarHandler : public CarHandler {
public:
    virtual void HandlerCar() {
        cout << "造車身" << endl;
        if (m_handler != NULL) {
            m_handler->HandlerCar();
        }
    }
};
class TailCarHandler : public CarHandler {
public:
    virtual void HandlerCar() {
        cout << "造車尾" << endl;
        if (m_handler != NULL) {
            m_handler->HandlerCar();
        }
    }
};
int main() {
    CarHandler* headHandle = new HeadCarHandler;
    CarHandler* bodyHandle = new BodyCarHandler;
    CarHandler* tailHandle = new TailCarHandler;
    // 業務順序可以發生變化
    headHandle->setNextHandler(bodyHandle);
    bodyHandle->setNextHandler(tailHandle);
    tailHandle->setNextHandler(NULL);
    headHandle->HandlerCar();
    delete headHandle;
    delete bodyHandle;
    delete tailHandle;
    cin.get();
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章