<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
“控制”指的是對程式執行流程的控制,而“反轉”指的是在沒有使用框架之前,程式設計師自己控制整個程式的執行。在使用框架之後,整個程式的執行流程可以通過框架來控制。流程的控制權從程式設計師“反轉”到了框架。
大白話說,就是原先直接用main函數中的程式碼流程,轉移到了框架中去。
#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(); }
什麼是依賴注入呢?
概括就是:不通過 new() 的方式在類內部建立依賴類物件,而是將依賴的類物件在外部建立好之後,通過建構函式、函數引數等方式傳遞(或注入)給類使用。
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"); //依賴注入,改為通過介面實現 Message *message = new phoneMessage(); NotifyIterface *notifyIterface = new NotifyIterface(message); notifyIterface->sendMsg(" Iphone !"); }
在採用依賴注入實現的 Notification 類中,雖然我們不需要用類似 hard code 的方式,在類內部通過 new 來建立 MessageSender 物件,但是,這個建立物件、組裝(或注入)物件的工作僅僅是被移動到了更上層程式碼而已,還是需要我們程式設計師自己來實現。
物件建立和依賴注入的工作,本身跟具體的業務無關,我們完全可以抽象成框架來自動完成。
實際上,現成的依賴注入框架有很多,比如 Google Guice、Java Spring、Pico Container、Butterfly Container 等。不過,如果你熟悉 Java Spring 框架,你可能會說,Spring 框架自己聲稱是控制反轉容器(Inversion Of Control Container)。
不過這一塊兒的東西先做了解,具體的實現需要自己想一想再去實現。
高層模組(high-level modules)不要依賴低層模組(low-level)。高層模組和低層模組應該通過抽象(abstractions)來互相依賴。除此之外,抽象(abstractions)不要依賴具體實現細節(details),具體實現細節(details)依賴抽象(abstractions)。
所謂高層模組和低層模組的劃分,簡單來說就是,在呼叫鏈上,呼叫者屬於高層,被呼叫者屬於低層。在平時的業務程式碼開發中,高層模組依賴底層模組是沒有任何問題的。
依賴反轉原則也叫作依賴倒置原則。這條原則跟控制反轉有點類似,主要用來指導框架層面的設計。高層模組不依賴低層模組,它們共同依賴同一個抽象。抽象不要依賴具體實現細節,具體實現細節依賴抽象。
到此這篇關於C++設計模式中控制反轉與依賴注入淺析的文章就介紹到這了,更多相關C++控制反轉與依賴注入內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45