最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

控制反轉(zhuǎn)

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

大白話說(shuō),就是原先直接用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)

什么是依賴注入呢?

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

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()
{
	//非依賴注入的寫(xiě)法
	Notification *notify = new Notification();
	notify->sendMsg("this is not DI");
	//依賴注入的寫(xiě)法,通過(guò)依賴注入的方式來(lái)將依賴的類(lèi)對(duì)象傳遞進(jìn)來(lái),這樣就提高了代碼的擴(kuò)展性
	MessageSender *msgobj = new MessageSender();
	Notification2 *notify2 = new Notification2(msgobj);
	notify2->sendMsg("this is DI");
	//依賴注入,改為通過(guò)接口實(shí)現(xiàn)
	Message *message = new phoneMessage();
	NotifyIterface *notifyIterface = new NotifyIterface(message);
	notifyIterface->sendMsg(" Iphone !");
}

依賴注入框架(DI Framework)

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

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

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

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

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

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

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

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

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

相關(guān)文章

  • C++關(guān)于類(lèi)結(jié)構(gòu)體大小和構(gòu)造順序,析構(gòu)順序的測(cè)試詳解

    C++關(guān)于類(lèi)結(jié)構(gòu)體大小和構(gòu)造順序,析構(gòu)順序的測(cè)試詳解

    這篇文章主要介紹了C++類(lèi)結(jié)構(gòu)體大小和構(gòu)造順序,析構(gòu)順序的測(cè)試,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • C語(yǔ)言動(dòng)態(tài)內(nèi)存管理介紹

    C語(yǔ)言動(dòng)態(tài)內(nèi)存管理介紹

    大家好,本篇文章主要講的是C語(yǔ)言動(dòng)態(tài)內(nèi)存管理介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • c++中的自增/自減操作方式

    c++中的自增/自減操作方式

    這篇文章主要介紹了C++中的自增和自減運(yùn)算符,包括前綴和后綴形式,并通過(guò)一個(gè)具體的例子解釋了自增/自減表達(dá)式的值與函數(shù)參數(shù)傳遞的關(guān)系,文章指出,自增/自減表達(dá)式的值是在表達(dá)式求值時(shí)確定的,而不是在自增/自減運(yùn)算后
    2025-03-03
  • C++容器算法示例詳解

    C++容器算法示例詳解

    在談到容器算法,我們大概率會(huì)用到謂詞predicate,謂詞返回的類(lèi)型是布爾類(lèi)型(bool)可以是lambda表達(dá)式、函數(shù)對(duì)象以及其它可調(diào)用的對(duì)象,這篇文章主要介紹了C++容器算法,需要的朋友可以參考下
    2024-08-08
  • VisualStudio2022配置opencv的實(shí)現(xiàn)

    VisualStudio2022配置opencv的實(shí)現(xiàn)

    本文主要介紹了VisualStudio2022配置opencv的實(shí)現(xiàn),文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-06-06
  • c++ signal實(shí)現(xiàn)發(fā)送信號(hào)

    c++ signal實(shí)現(xiàn)發(fā)送信號(hào)

    這篇文章主要為大家詳細(xì)介紹了c++ signal實(shí)現(xiàn)發(fā)送信號(hào)的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • C++實(shí)現(xiàn)LeetCode(126.詞語(yǔ)階梯之二)

    C++實(shí)現(xiàn)LeetCode(126.詞語(yǔ)階梯之二)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(126.詞語(yǔ)階梯之二),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 詳解c++中的異常

    詳解c++中的異常

    程序在運(yùn)行過(guò)程中,有對(duì)也就有錯(cuò),正確那么就不用說(shuō)了,但是如果錯(cuò)誤,那么我們?nèi)绾慰焖俚亩ㄎ坏藉e(cuò)誤的位置,以及知道發(fā)生了什么錯(cuò)誤。當(dāng)一個(gè)函數(shù)發(fā)現(xiàn)自己無(wú)法處理的異常,就會(huì)拋出一個(gè)異常,讓函數(shù)調(diào)用者直接或者間接的處理這個(gè)錯(cuò)誤。本文將詳解介紹c++中的異常
    2021-06-06
  • C++使用printf語(yǔ)句實(shí)現(xiàn)進(jìn)制轉(zhuǎn)換的示例代碼

    C++使用printf語(yǔ)句實(shí)現(xiàn)進(jìn)制轉(zhuǎn)換的示例代碼

    在C語(yǔ)言中,printf 函數(shù)可以直接實(shí)現(xiàn)部分進(jìn)制轉(zhuǎn)換功能,通過(guò)格式說(shuō)明符(format specifier)快速輸出不同進(jìn)制的數(shù)值,下面給大家分享C++使用printf語(yǔ)句實(shí)現(xiàn)進(jìn)制轉(zhuǎn)換的示例代碼,感興趣的朋友一起看看吧
    2025-04-04
  • C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)實(shí)例講解單鏈表的實(shí)現(xiàn)

    C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)實(shí)例講解單鏈表的實(shí)現(xiàn)

    單鏈表是后面要學(xué)的雙鏈表以及循環(huán)鏈表的基礎(chǔ),要想繼續(xù)深入了解數(shù)據(jù)結(jié)構(gòu)以及C++,我們就要奠定好這塊基石!接下來(lái)就和我一起學(xué)習(xí)吧
    2022-03-03

最新評(píng)論

巨野县| 淄博市| 鸡东县| 赤城县| 洛宁县| 泗阳县| 朔州市| 新和县| 泰和县| 西丰县| 浑源县| 什邡市| 沙坪坝区| 定州市| 青神县| 辽中县| 凤山县| 玉环县| 砚山县| 什邡市| 六盘水市| 汝阳县| 长乐市| 防城港市| 枝江市| 临湘市| 吴堡县| 汉沽区| 临漳县| 光泽县| 萍乡市| 平顺县| 清远市| 新乡市| 河南省| 五峰| 佛教| 班玛县| 镇康县| 无棣县| 教育|