責任鏈模式C++實現
1定義
使多個對象都有機會處理請求,從而避免了請求的發送者和接受者之間的耦合關系。將這些對象鏈成一條鏈,並沿着這條鏈傳遞該請求/命令,直到有對象處理它為止
注:這里的請求、命令正是可以和命令模式進行結合的地方
2類圖
class Handler
{
private:
Handler* nextHandler;
protected:
Handler();
pubic:
virtual~Handler()=0;
//每個處理者都必須對請求作出處理,如果是自己能處理的,自己處理,並且返回結果。否則,傳遞給下一個處理者
Response handleMessage(Request *request)
{
Response *res = NULL;
//如果請求級別和處理者級別相同/有能力處理,那么處理
if(getHandlerLevel() == request.getRequestLevel())
{
res = echo(request);
}
else
{
if(nextHandler!= NULL)
{
res = nextHandler.handleMessage(request);
}
else
{
//沒有適當的處理者,業務自行處理
}
}
}
void setNext(Handler hand)
{
nextHandler = hand;
}
protected:
virtual Level getHandlerLevel()=0;
//每個處理者都必須實現處理任務
Response echo(Request res);
};
注:抽象處理者的三個職責:①定義請求處理方案,唯一對外開放;②定義一個鏈的編排方法setNext;③定義具體處理者的兩個方法(權限獲取和處理)
class ConcreteHandler:public Handler
{
public:
ConcreteHandler();
~ConcreteHandler();
protected:
Response echo()
{
//完成邏輯
return NULL;
}
Level getHandlerLevel()
{
//設置自己的處理級別
return;
}
};
//等級設置。可以在內部詳細處理優先級設置問題
class Level{};
//請求封裝
class Request
{
public:
Level getRequestLevel()
{
return NULL;
}
};
//處理者返回的數據
class Response
{};
4提升性
①在實際中對於責任鏈的設置多半是固定的,所以可以將之封裝從而實現客戶端的最少知道(迪米特原則)
②在責任鏈中設置最大結點數
5應用
①優點
將請求和處理分開,達到解耦,迪米特。
②缺點
鏈長度過長時就會有效率問題,其次是調試問題(這個問題也類似於遞歸)
6 總結
責任鏈可以作為一種補救措施.--中介者模式---模板方法模式