欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++設(shè)計模式中控制反轉(zhuǎn)與依賴注入淺析

 更新時間:2023年01月13日 16:26:59   作者:吃個橙子吧  
這篇文章主要介紹了C++設(shè)計模式中控制反轉(zhuǎn)與依賴注入,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧

控制反轉(zhuǎn)

“控制”指的是對程序執(zhí)行流程的控制,而“反轉(zhuǎn)”指的是在沒有使用框架之前,程序員自己控制整個程序的執(zhí)行。在使用框架之后,整個程序的執(zhí)行流程可以通過框架來控制。流程的控制權(quán)從程序員“反轉(zhuǎn)”到了框架。

大白話說,就是原先直接用main函數(shù)中的代碼流程,轉(zhuǎn)移到了框架中去。

#include <iostream>
#include <list>
using namespace std;
class TestCase
{
public:
	TestCase() {};
	~TestCase() {};
	virtual int test() = 0;
	void run()
	{
		switch (test())
		{
		case 1:cout << "1\ test() " << endl; break;
		case 2:cout << "2\ test() " << endl; break;
		default:
			break;
		}
	}
};
class Cases : public TestCase
{
	virtual int test() override
	{
		return 1;
	}
};
class Dases : public TestCase
{
	virtual int test() override
	{
		return 2;
	}
};
class Application
{
public:
	void registers(TestCase *cases)
	{
		testCases.push_back(cases);
	}
	void runStage()
	{
		for (auto&it : testCases)
		{
			it->run();
		}
	}
private:
	list<TestCase*> testCases;
};
int main()
{
    std::cout << "Hello World!\n";
	TestCase *case1 = new Cases();
	TestCase *dase1 = new Dases();
	Application app;
	app.registers(case1);
	app.registers(dase1);
	app.runStage();
}

依賴注入(DI)

什么是依賴注入呢?

概括就是:不通過 new() 的方式在類內(nèi)部創(chuàng)建依賴類對象,而是將依賴的類對象在外部創(chuàng)建好之后,通過構(gòu)造函數(shù)、函數(shù)參數(shù)等方式傳遞(或注入)給類使用。

class Message
{
public:
	virtual void send(string msg) = 0;
};
class phoneMessage : public Message
{
public:
	virtual void send(string msg) override
	{
		cout << "this is phone msg : " << msg.c_str() << endl;
	}
private:
};
class NotifyIterface
{
public:
	NotifyIterface(Message *obj)
	{
		message = obj;
	}
	void sendMsg(string msg)
	{
		message->send(msg);
	}
private:
	Message *message;
};
class MessageSender
{
public:
	void sender(string msg)
	{
		cout << msg.c_str() << endl;
	}
};
//非依賴注入
class Notification
{
public:
	Notification()
	{
		msgsender = new MessageSender();
	}
	void sendMsg(string msg)
	{
		msgsender->sender(msg);
	}
private:
	MessageSender *msgsender;
};
//依賴注入
class Notification2
{
public:
	Notification2(MessageSender *obj)
	{
		msgsender = obj;
	}
	void sendMsg(string msg)
	{
		msgsender->sender(msg);
	}
private:
	MessageSender *msgsender;
};
int main()
{
	//非依賴注入的寫法
	Notification *notify = new Notification();
	notify->sendMsg("this is not DI");
	//依賴注入的寫法,通過依賴注入的方式來將依賴的類對象傳遞進來,這樣就提高了代碼的擴展性
	MessageSender *msgobj = new MessageSender();
	Notification2 *notify2 = new Notification2(msgobj);
	notify2->sendMsg("this is DI");
	//依賴注入,改為通過接口實現(xiàn)
	Message *message = new phoneMessage();
	NotifyIterface *notifyIterface = new NotifyIterface(message);
	notifyIterface->sendMsg(" Iphone !");
}

依賴注入框架(DI Framework)

在采用依賴注入實現(xiàn)的 Notification 類中,雖然我們不需要用類似 hard code 的方式,在類內(nèi)部通過 new 來創(chuàng)建 MessageSender 對象,但是,這個創(chuàng)建對象、組裝(或注入)對象的工作僅僅是被移動到了更上層代碼而已,還是需要我們程序員自己來實現(xiàn)。

對象創(chuàng)建和依賴注入的工作,本身跟具體的業(yè)務(wù)無關(guān),我們完全可以抽象成框架來自動完成。

實際上,現(xiàn)成的依賴注入框架有很多,比如 Google Guice、Java Spring、Pico Container、Butterfly Container 等。不過,如果你熟悉 Java Spring 框架,你可能會說,Spring 框架自己聲稱是控制反轉(zhuǎn)容器(Inversion Of Control Container)。

不過這一塊兒的東西先做了解,具體的實現(xiàn)需要自己想一想再去實現(xiàn)。

依賴反轉(zhuǎn)原則(DIP)

高層模塊(high-level modules)不要依賴低層模塊(low-level)。高層模塊和低層模塊應(yīng)該通過抽象(abstractions)來互相依賴。除此之外,抽象(abstractions)不要依賴具體實現(xiàn)細節(jié)(details),具體實現(xiàn)細節(jié)(details)依賴抽象(abstractions)。

所謂高層模塊和低層模塊的劃分,簡單來說就是,在調(diào)用鏈上,調(diào)用者屬于高層,被調(diào)用者屬于低層。在平時的業(yè)務(wù)代碼開發(fā)中,高層模塊依賴底層模塊是沒有任何問題的。

依賴反轉(zhuǎn)原則也叫作依賴倒置原則。這條原則跟控制反轉(zhuǎn)有點類似,主要用來指導框架層面的設(shè)計。高層模塊不依賴低層模塊,它們共同依賴同一個抽象。抽象不要依賴具體實現(xiàn)細節(jié),具體實現(xiàn)細節(jié)依賴抽象。

到此這篇關(guān)于C++設(shè)計模式中控制反轉(zhuǎn)與依賴注入淺析的文章就介紹到這了,更多相關(guān)C++控制反轉(zhuǎn)與依賴注入內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言算法練習之數(shù)組元素排序

    C語言算法練習之數(shù)組元素排序

    這篇文章主要為大家介紹了C語言算法練習中數(shù)組元素排序的實現(xiàn)方法,文中的示例代碼講解詳細,對我們學習C語言有一定幫助,需要的可以參考一下
    2022-09-09
  • C++使用easyx實現(xiàn)打磚塊游戲

    C++使用easyx實現(xiàn)打磚塊游戲

    這篇文章主要為大家詳細介紹了C++使用easyx實現(xiàn)打磚塊游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 你必須知道的C語言預(yù)處理的問題詳解

    你必須知道的C語言預(yù)處理的問題詳解

    本篇文章介紹了,你必須知道的C語言預(yù)處理的問題。需要的朋友參考下
    2013-05-05
  • C++?雙向循環(huán)鏈表類模版實例詳解

    C++?雙向循環(huán)鏈表類模版實例詳解

    這篇文章主要為大家詳細介紹了C++?雙向循環(huán)鏈表類模版實例,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • C++實現(xiàn)動態(tài)規(guī)劃過程詳解

    C++實現(xiàn)動態(tài)規(guī)劃過程詳解

    動態(tài)規(guī)劃是解決一類最優(yōu)問題的常用方法,它是解決最優(yōu)化問題的一種途徑,在本文中,我們將討論如何使用C++實現(xiàn)動態(tài)規(guī)劃算法,并提供一些示例來幫助您更好地理解該算法
    2023-05-05
  • 數(shù)據(jù)結(jié)構(gòu)順序表操作示例

    數(shù)據(jù)結(jié)構(gòu)順序表操作示例

    這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu)順序表操作示例,其中有在第I個元素前插入數(shù)據(jù)x,元素從0開始計數(shù)、刪除第i個元素,元素從0開始計數(shù)的方法,需要的朋友可以參考下
    2014-03-03
  • C++中各種初始化方式示例詳解

    C++中各種初始化方式示例詳解

    這篇文章主要給大家介紹了關(guān)于C++中各種初始化方式的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用C++具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2017-10-10
  • C語言實現(xiàn)空戰(zhàn)游戲

    C語言實現(xiàn)空戰(zhàn)游戲

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)空戰(zhàn)游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C++?如何將Lambda轉(zhuǎn)換成函數(shù)指針

    C++?如何將Lambda轉(zhuǎn)換成函數(shù)指針

    這篇文章主要介紹了C++?如何將Lambda轉(zhuǎn)換成函數(shù)指針,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • QT中QTableWidget加載大量數(shù)據(jù)不卡頓的解決

    QT中QTableWidget加載大量數(shù)據(jù)不卡頓的解決

    本文主要介紹了QT中QTableWidget加載大量數(shù)據(jù)不卡頓的解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07

最新評論