設計模式之責任鏈模式

一、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;
}



發佈了73 篇原創文章 · 獲贊 13 · 訪問量 25萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章