《設計模式》學習筆記——責任鏈模式
阿新 • • 發佈:2018-12-17
責任鏈模式(Chain of Responsibility Pattern)為請求建立了一個接收者物件的鏈,這種模式給予請求的型別,對請求的傳送者和接收者進行解耦,屬於行為型模式。在這種模式中,通常每個接收者都包含對另一個接收者的引用。如果一個物件不能處理該請求,那麼它會把相同的請求傳給下一個接收者,依此類推。
意圖: 避免請求傳送者與接收者耦合在一起,讓多個物件都有可能接收請求,將這些物件連線成一條鏈. 並且沿著這條鏈傳遞請求,直到有物件處理它為止。主要解決: 職責鏈上的處理者負責處理請求,客戶只需要將請求傳送到職責鏈上即可. 無須關心請求的處理細節和請求的傳遞,所以職責鏈將請求的傳送者和請求的處理者解耦了。何時使用:
ChainOfResponsibilityPattern.h
#pragma once #include<iostream> #include<string> //責任連結口,抽象類 class CarHandle { public: CarHandle() { m_nextCarHandle = nullptr; } ~CarHandle() {} virtual void HandleCar()= 0; CarHandle* setNextHandleCar(CarHandle * nextCarHandle)// 用於將責任向後傳遞 { m_nextCarHandle = nextCarHandle; return m_nextCarHandle; } private: protected: CarHandle* m_nextCarHandle; // 指向下一個鏈條節點的指標 }; // 子任務 class HeadCarHandle:public CarHandle { public: virtual void HandleCar() { std::cout<<"HeadCarHandle HandleCar()"<<std::endl; //執行完成自己的人物後,如果需要向後傳遞則向後傳遞 if (nullptr != m_nextCarHandle) { m_nextCarHandle->HandleCar(); } } private: protected: }; // 子任務 class BodyCarHandle :public CarHandle { public: virtual void HandleCar() { std::cout << "BodyCarHandle HandleCar()" << std::endl; //執行完成自己的人物後,如果需要向後傳遞則向後傳遞 if (nullptr != m_nextCarHandle) { m_nextCarHandle->HandleCar(); } } private: protected: }; // 子任務 class TailCarHandle :public CarHandle { public: virtual void HandleCar() { std::cout << "TailCarHandle HandleCar()" << std::endl; //執行完成自己的人物後,如果需要向後傳遞則向後傳遞 if (nullptr != m_nextCarHandle) { m_nextCarHandle->HandleCar(); } } private: protected: }; class ChainOfResponsibilityPattern { public: ChainOfResponsibilityPattern() {}; ~ChainOfResponsibilityPattern() {}; };
ChainOfResponsibilityPattern.cpp
#include "ChainOfResponsibilityPattern.h"
mainTest.cpp
#include<iostream>
#include<string>
#include "ChainOfResponsibilityPattern.h"
int main(void)
{
CarHandle* headCarHandle = new HeadCarHandle;
CarHandle* bodyCarHandle = new BodyCarHandle;
CarHandle* tailCarHandle = new TailCarHandle;
// 建立任務處理的關係連結串列
headCarHandle->setNextHandleCar(bodyCarHandle)->setNextHandleCar(tailCarHandle);
// 開始工作
headCarHandle->HandleCar();
delete headCarHandle;
delete bodyCarHandle;
delete tailCarHandle;
system("pause");
return 0;
}