一、UML圖
二、介紹
職責鏈模式(Chain Of Responsibility):使多個對象都有機會處理請求,從而避免請求的發送者和接受者之間的耦合關係。將這個對象連成一條鏈,並沿着這條鏈傳遞該請求,直到有一個對象處理他爲止。
職責鏈模式主要用於當一個請求有多種處理方式的時候,並且具體處理方式不確定的情況。
使用職責鏈模式的優點:
1.增強了系統的可擴展性。
2.使用職責鏈模式可以避免衆多的if或者if-else語句。
3.使用職責鏈模式可以減小對象之間的耦合性。使得對象之間的聯繫減小。
4.可以根據需要自由組合工作流程。如工作流程發生變化,可以通過重新分配對象鏈便可適應新的工作流程。
5.責任的分擔。每個類只需要處理自己該處理的工作(不該處理的傳遞給下一個對象完成),明確各類的責任範圍,符合類的最小封裝原則。
使用職責鏈模式的缺點:
1.使用職責鏈模式的時候會有多個處理者對象,但是實際使用的處理者對象卻只有一個,這在某種程度講是資源的浪費。
2.同時職責鏈的建立的合理性要靠客戶端來保證,增加了程序的複雜性,也有可能由於職責鏈導致出錯。
三、代碼示範#include <iostream>
using namespace std;
class Handler
{
public:
Handler():handler(){}
virtual ~Handler()
{
cout << "Handler Construct" << endl;
}
void setSuccessor(Handler *successor)
{
handler = successor;
}
virtual void handleRequest(int request) = 0;
protected:
Handler *handler;
};
class ConcreteHandler1 : public Handler
{
public:
ConcreteHandler1():Handler()
{
cout << "ConcreteHandler1 Construct" << endl;
}
~ConcreteHandler1(){}
virtual void handleRequest(int request)
{
if (request >= 0 && request < 10)
{
cout << typeid(*this).name() << " could hand " << request << endl;
}
else if (handler != NULL)
{
handler->handleRequest(request);
}
}
};
class ConcreteHandler2 : public Handler
{
public:
ConcreteHandler2():Handler(){}
~ConcreteHandler2()
{
cout << "ConcreteHandler2 Construct" << endl;
}
virtual void handleRequest(int request)
{
if (request >= 10 && request < 20)
{
cout << typeid(*this).name() << " could hand " << request << endl;
}
else if (handler != NULL)
{
handler->handleRequest(request);
}
}
};
class ConcreteHandler3 : public Handler
{
public:
ConcreteHandler3():Handler(){}
~ConcreteHandler3()
{
cout << "ConcreteHandler3 Construct" << endl;
}
virtual void handleRequest(int request)
{
if (request >= 20 && request < 30)
{
cout << typeid(*this).name() << " could hand " << request << endl;
}
else if (handler != NULL)
{
handler->handleRequest(request);
}
}
};
int main()
{
Handler *h1 = new ConcreteHandler1();
Handler *h2 = new ConcreteHandler2();
Handler *h3 = new ConcreteHandler3();
h1->setSuccessor(h2);
h2->setSuccessor(h3);
h1->handleRequest(50);
delete h1;
delete h2;
delete h3;
getchar();
return 0;
}