国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

設計模式之責任鏈模式(二): 實現(xiàn)方式

這篇具有很好參考價值的文章主要介紹了設計模式之責任鏈模式(二): 實現(xiàn)方式。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

C++設計模式專欄:

相關文章系列

設計模式之責任鏈模式(一)-CSDN博客

目錄

1.引言

2.實現(xiàn)方式1

3.實現(xiàn)方式2

4.總結? ? ? ??


1.引言

????????責任鏈設計模式(Chain of Responsibiliy DesignPattern)簡稱職責鏈模式。在GOF的《設計模式:可復用面向?qū)ο筌浖幕A》中,它是這樣定義的:將請求的發(fā)送和接收解耦,讓多個接收對象都有機會處理這個請求;將這些接收對象串成一條鏈,并沿者這條鏈傳遞這個請求,直到鏈上的某個接收對象能夠處理它為止(Avoid coupling the?sender of?a?request to its receiver by giving more than one object a chance to handle the request. Chain the receiving objects and pass the request along the chain until an object handles it )。

????????在職責鏈模式中,多個處理器(也就是定義中所說的“接收對象”)依次處理同一個請求。一個請求首先經(jīng)過A處理器處理,然后,這個請求被傳遞給B處理器,B處理器處理完后再將其傳遞給C處理器,以此類推,形成一個鏈條。因為鏈條上的每個處理器各自承擔各自職責,所以稱為職責鏈模式。

????????職責鏈模式有多種實現(xiàn)方式,這里介紹兩種常用的。

2.實現(xiàn)方式1

????????實現(xiàn)方式的代碼如下所示。其中,Handler類是所有處理器類的抽象父類,handle()是抽象方法。每個具體的處理器類(HandlerA、HandlerB)的handle()函數(shù)的代碼結構類似,如果某個處理器能夠處理該請求,就不繼續(xù)往下傳遞;如果它不能處理,則交由后面的處理器處理(也就是調(diào)用successor.handle())。HandlerChain類表示處理器鏈,從數(shù)據(jù)結構的角度來看,它就是一個記錄了鏈頭、鏈尾的鏈表。其中,記錄鏈尾是為了方便添加處理器。

#pragma once
#include <memory>
#include <vector>

class IHandler
{
protected:
	IHandler* m_successor;
public:
	void setSuccessor(IHandler* successor) {
		m_successor = successor;
	}
	virtual void handle() = 0;
};

class HandlerA : public IHandler
{
public:
	//...
	//@override
	void handle() override {
		bool bHandle = false;
		//...
		if (!bHandle && m_successor) {
			m_successor->handle();
		}
		//...
	}
};

class HandlerB : public IHandler
{
public:
	//...
	//@override
	void handle() override {
		bool bHandle = false;
		//...
		if (!bHandle && m_successor) {
			m_successor->handle();
		}
		//...
	}
};

class HandlerChain {
private:
	IHandler* head = nullptr;
	IHandler* tail = nullptr;
public:
	void addHandler(IHandler* handler) {
		handler->setSuccessor(nullptr);
		if (head == nullptr) {
			head = handler;
			tail = handler;
			return;
		}
		tail->setSuccessor(handler);
		tail = handler;
	}
	void handle() {
		if (head != nullptr) {
			head->handle();
		}
	}
};

//使用舉例
int main() {
	std::unique_ptr<IHandler> pHandleA(new HandlerA());
	std::unique_ptr<IHandler> pHandleB(new HandlerB());
	HandlerChain chain;

	chain.addHandler(pHandleA.get());
	chain.addHandler(pHandleB.get());

	chain.handle();

    return 1;
}

????????實際上,上面的代碼實現(xiàn)不夠優(yōu)雅,因為處理器類的handle()函數(shù)不僅包含自己的業(yè)務邏輯。還包含對下一個處理器的調(diào)用(對應代碼中的successor.handle())。如果一個不熟悉這種代碼結構的程序員想要在其中添加新的處理器類,那么很有可能忘記在handle()函數(shù)中調(diào)用successor.handle(),這就會導致代碼出現(xiàn)bug。

設計模式之模板方法模式-CSDN博客

????????針對這個問題,我們對代碼進行重構,利用模版方法模式,將調(diào)用successor.handle()的邏輯從處理器中剝離出來,放到抽象父類中。這樣,處理器類只需要實現(xiàn)自己的業(yè)務邏輯。重構之后的代碼如下所示:

class IHandler
{
protected:
	IHandler* m_successor;
public:
	void setSuccessor(IHandler* successor) {
		m_successor = successor;
	}
	void handle() {
		bool bHandled = doHandle();
		if (!bHandled && m_successor) {
			m_successor->handle();
		}
	}
protected:
	virtual bool doHandle() = 0;
};

class HandlerA : public IHandler
{
protected:
	//...
	//@override
	bool doHandle() override {
		bool bHandle = false;
		//...
		return bHandle;
	}
};

class HandlerB : public IHandler
{
protected:
	//...
	//@override
	bool doHandle() override {
		bool bHandle = false;
		//...
		return bHandle;
	}
};

class HandlerChain {
private:
	IHandler* head = nullptr;
	IHandler* tail = nullptr;
public:
	void addHandler(IHandler* handler) {
		handler->setSuccessor(nullptr);
		if (head == nullptr) {
			head = handler;
			tail = handler;
			return;
		}
		tail->setSuccessor(handler);
		tail = handler;
	}
	void handle() {
		if (head != nullptr) {
			head->handle();
		}
	}
};

int  main() {
	std::unique_ptr<IHandler> pHandleA(new HandlerA());
	std::unique_ptr<IHandler> pHandleB(new HandlerB());
	HandlerChain chain;

	chain.addHandler(pHandleA.get());
	chain.addHandler(pHandleB.get());

	chain.handle();

    return 1;
}

3.實現(xiàn)方式2

????????實現(xiàn)代碼如下所示,這種實現(xiàn)方式更加簡單,其中HandlerChain 類用數(shù)組而非鏈表來保存所有處理器類,并且在HandlerChain類的handle()函數(shù)中,依次調(diào)用每個處理器類的 handle()函數(shù)。

class IHandler
{
public:
	virtual bool handle() = 0;
};

class HandlerA : public IHandler
{
public:
	//...
	//@override
	bool handle() override {
		bool bHandle = false;
		//...
		return bHandle;
	}
};

class HandlerB : public IHandler
{
public:
	//...
	//@override
	bool handle() override {
		bool bHandle = false;
		//...
		return bHandle;
	}
};

class HandlerChain {
private:
	std::vector<IHandler*> m_vecHandler;
public:
	void addHandler(IHandler* handler) {
		m_vecHandler.push_back(handler);
	}
	void handle() {
		for (auto& it : m_vecHandler) {
			if (it->handle()) {
				break;
			}
		}
	}
};

int main() {
	std::unique_ptr<IHandler> pHandleA(new HandlerA());
	std::unique_ptr<IHandler> pHandleB(new HandlerB());
	HandlerChain chain;

	chain.addHandler(pHandleA.get());
	chain.addHandler(pHandleB.get());

	chain.handle();

    return 1;
}

????????在GoF合著的《設計模式:可復用面向?qū)ο筌浖幕A》給出的職責鏈模式的定義中。如果處理器鏈上的某個處理器能夠處理這個請求,就不會繼續(xù)往下傳遞請求。實際上,職責鏈模式還有一種變體,那就是請求會被所有處理器都處理一遍,不存在中途終止的情況。這種變體也有兩種實現(xiàn)方式: 用鏈表存儲處理器類和用數(shù)組存儲處理器類,與上面兩種實現(xiàn)方式類似稍加修改即可。這里只給出用鏈表存儲處理器類的實現(xiàn)方式,代碼如下所示。對于用數(shù)組存儲處理器類的實現(xiàn)方式,讀者可對照上面的實現(xiàn)自行修改。

class IHandler
{
protected:
	IHandler* m_successor;
public:
	void setSuccessor(IHandler* successor) {
		m_successor = successor;
	}
	void handle() {
		doHandle();
		if (m_successor) {
			m_successor->handle();
		}
	}
protected:
	virtual void doHandle() = 0;
};

class HandlerA : public IHandler
{
protected:
	//...
	//...
	//@override
	void doHandle() override {
		//...
	}
};

class HandlerB : public IHandler
{
protected:
	//...
	//@override
	void doHandle() override {
		//...
	}
};

class HandlerChain {
private:
	IHandler* head = nullptr;
	IHandler* tail = nullptr;
public:
	void addHandler(IHandler* handler) {
		handler->setSuccessor(nullptr);
		if (head == nullptr) {
			head = handler;
			tail = handler;
			return;
		}
		tail->setSuccessor(handler);
		tail = handler;
	}
	void handle() {
		if (head != nullptr) {
			head->handle();
		}
	}
};

int main() {
	std::unique_ptr<IHandler> pHandleA(new HandlerA());
	std::unique_ptr<IHandler> pHandleB(new HandlerB());
	HandlerChain chain;

	chain.addHandler(pHandleA.get());
	chain.addHandler(pHandleB.get());

	chain.handle();

    return 1;
}

4.總結? ? ? ??

????????盡管我們給出了典型的職責鏈模式的代碼實現(xiàn),但在實際的開發(fā)中,我們還是要具體問題具體對待,因為職責鏈模式的代碼實現(xiàn)會根據(jù)需求的不同而有所變化。實際上,這一點對于有設計模式都適用。文章來源地址http://www.zghlxwxcb.cn/news/detail-859353.html

到了這里,關于設計模式之責任鏈模式(二): 實現(xiàn)方式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 設計模式—責任鏈模式

    設計模式—責任鏈模式

    一、待解決問題 : 減少代碼中 if else 語句,降低代碼圈復雜度或深度,增強可讀性。 1、需求背景: 采購訂單創(chuàng)建,需要驗證采購員、物料、供應商、供應商的銀行賬號等信息。如采購員權限到期、或供應商失效等問題,都無法下單。 2、代碼如下: 學習使用責任鏈模式后

    2024年02月10日
    瀏覽(19)
  • 設計模式-責任鏈模式

    遇到一個面試的場景題目,讓實現(xiàn)稅率的計算 請使用Java語言實現(xiàn)如下稅率計算: 1~5000 稅率 0 5001~8000 3% 8001~17000 10% 17001~30000 20% 30001~40000 25% 40001~60000 30% 60001~85000 35% 85001~ 45% 要求 ⅰ. 邏輯正確,代碼優(yōu)雅 ⅱ. 可擴展性,考慮區(qū)間的變化,比如說起征點從5000變成10000等等,或者

    2024年02月11日
    瀏覽(24)
  • 設計模式——責任鏈模式

    設計模式——責任鏈模式

    使多個對象都有機會處理請求,從而避免了請求的發(fā)送者和接收者之間的耦合關系。將這些對象連成一條鏈,并沿著這條鏈傳遞該請求,知道有對象處理它為止。 優(yōu)點 能將請求和處理分開。請求者可以不用知道是誰處理的,處理者可以不用知道請求的全貌,兩者解耦提高系

    2024年02月15日
    瀏覽(18)
  • 設計模式——22. 責任鏈模式

    責任鏈模式是一種行為設計模式,它允許你創(chuàng)建一個對象鏈,每個對象都包含了請求的一部分處理邏輯,并且請求按照鏈的順序依次傳遞,直到有一個對象處理它為止。責任鏈模式通常用于將一個請求從發(fā)送者傳遞給多個接收者,直到有一個接收者處理請求為止。 責任鏈模式

    2024年02月07日
    瀏覽(20)
  • 重溫設計模式 --- 責任鏈模式

    責任鏈模式 是一種行為型設計模式,它通過一條由多個處理器組成的鏈來處理請求,每個處理器都有機會處理請求,如果一個處理器不能處理該請求,它會將請求傳遞給下一個處理器,直到請求被處理為止。 在實際應用中,責任鏈模式常用于處理請求的分發(fā)、事件處理等場

    2024年02月13日
    瀏覽(22)
  • 設計模式之責任鏈模式

    設計模式之責任鏈模式

    責任鏈設計模式是一種行為設計模式,它允許你創(chuàng)建一個對象鏈。請求從鏈的一端進入,并沿著鏈的路徑依次經(jīng)過各個對象,直至找到合適的處理者。每個對象都決定是否要處理該請求或?qū)⑵鋫鬟f給鏈中的下一個對象。 1.1 核心概念 Handler(處理者):每個處理者對象包含了處

    2024年02月05日
    瀏覽(20)
  • 說說設計模式~責任鏈模式

    說說設計模式~責任鏈模式

    回到目錄 它是一種設計模塊,主要將操作流程與具體操作解耦,讓每個操作都可以設置自己的操作流程,這對于工作流應用是一個不錯的選擇! 下面是官方標準的定義:責任鏈模式是一種設計模式。在責任鏈模式里,很多對象由每一個對象對其下家的引用而連接起來形成一

    2024年02月11日
    瀏覽(22)
  • 面試設計模式-責任鏈模式

    面試設計模式-責任鏈模式

    在進行請假申請,財務報銷申請,需要走部門領導審批,技術總監(jiān)審批,大領導審批等判斷環(huán)節(jié)。存在請求方和接收方耦合性太強,代碼會比較臃腫,不利于擴展和維護。 針對上面,使用責任鏈模式,將請求方和接收方的業(yè)務進行解耦, 客戶端發(fā)送一個請求,由一個抽象的

    2024年02月09日
    瀏覽(23)
  • 設計模式詳解-責任鏈模式

    類型:行為型模式 實現(xiàn)原理:為請求創(chuàng)建了一個接收者對象的鏈。對請求的發(fā)送者和接收者進行解耦,每個接收者都包含對另一個接收者的引用,如果一個對象不能處理該請求,那么它會把相同的請求傳給下一個接收者,依此類推。 作用:避免請求發(fā)送者與接收者耦合在一

    2024年02月12日
    瀏覽(13)
  • 設計模式07-責任鏈模式

    設計模式07-責任鏈模式

    責任鏈模式屬于行為設計模式,常見的過濾器鏈就是使用責任鏈模式設計的。 Q:假設有一個闖關游戲,共三關,每一關達到通過條件后才能進入下一關,使用java實現(xiàn)。 A:針對這個問題,按照樸素的想法,我們可以定義三個類,分別是第一關、第二關、第三關,客戶端啟動

    2024年02月16日
    瀏覽(16)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包