IOC控制反轉是如何做到解耦和的

2021-08-22 07:13:11 字數 2604 閱讀 9975

原來就了解過ioc控制反轉的設計思想,也看過一些文章,總覺得自己好像都看得懂,也知道在講什麼,知道其能很好的解耦和,卻隱隱約約又感覺自己好像還差了點什麼。這次有點小運氣,在寫自己的迷你框架的時候,寫到中途突然有種或豁然開朗的感覺,這裡就次記錄一下。

先說一下最開始的想法,假設有一天你需要輸出各式各樣的東西(種類繁多),比如各式各樣的操作資訊、教程、漂亮的html靜態頁面、以及各式各樣的日誌等等等等,如果都堆到乙個類裡面,顯然不利於輸出資訊的分類,影響**可讀性,更不利於維護。這裡我打算是寫乙個輸出的類,比如我想在filter中輸出乙個許可權不足的html頁面字串(有樣式),我希望以這樣的方式呼叫:string html_noauthority = myformat.fortype().html().problem().noauthority().in("***problem has encountered").out() ,如果是輸出做某件事成功,則以這樣的方式呼叫:myformat.fortype().html().success().out() 或者   myformat.fortype().html().success().in("register succeed").out()

最開始是這樣寫的:  以myformat.fortype().html().problem().noauthority()的呼叫為例

這樣寫確實是可以實現,但是其壞處也顯而易見,那就是寫的太死,耦合度太高了,從上面鏈式的呼叫中也可以看到,我每乙個return的類都是指定的自己的實現類,設想假如別人(小紅)想用你的東西,他覺得你其他的輸出類都挺好,就是這個noauthority實現類的樣式寫的太醜了,別人想用他自己的noauthority_beautiful實現類來代替你的類,但是以jar包形式的原始碼一般又是不可以修改的,即使可以修改,在業務變動的情況下需要頻繁地修改別人的原始碼。顯然,如果這麼寫肯定不合理。

那怎麼辦呢?有人想,直接在這些基礎上來乙個函式過載,如果想用自己的實現類就傳乙個自己的class進來,比如:

如果是這樣,好,那完蛋了。因為很顯然,返回值是介面,這麼寫就相當於沒寫,如果硬是要這麼寫,那只能在該類的介面中多加乙個重在函式,但是這樣,好,那也完蛋了(大量的實現類要修改,和**重複)。如果只保留上圖中第二個函式,雖然可以可以滿足小紅的需求,但是每次都要傳乙個class進來,使得使用起來極其不爽(顯得多此一舉),同時try catch還會影響一點點速度,更重要的是,在每乙個實現了這種帶class引數的介面的類中,每乙個函式都要try catch ,顯然冗餘了大量重複且不可觀的**,於是乎三個字:完蛋了

所以看到這裡,在沒有ioc的情況下,整個小體系給人感覺就是一潭死水,沒有生機也不靈動

寫到這想必已經開始明了了,我們只需要將noauthority該實現類的物件提出來 (即這裡定義的 thitiertype  noauthority引用),並對其提供乙個set方法,然後,,,然後通過ioc容器配置相關bean,就可以對該引用瘋狂地賦值了!原來是寫死的noauthority實現類,現在管你想替換成什麼noauthority_beautiful還是什麼noauthority_beautifulplus或是什麼noauthority_beautifulsuperplus都可以!

那麼究竟是哪個環節一下子就輕鬆地打破了這灘死水呢?關鍵其實就是看究竟是誰建立出了noauthority類的物件

在傳統的方式中,是noauthority函式主動地去建立了noauthority類物件給別人用,而在ioc思想中,是ioc容器建立了noauthority類物件然後給noauthority函式用(關係被反轉了)。那為什麼這種反轉能帶來如此強大的靈活性和多樣性呢?

我們可以這樣想,傳統方式中是**指定建立什麼類,可**是死的,**指定建立什麼就只能建立什麼。在ioc中是人指定建立什麼類(即配置),**是死,但人是活的,你想換成什麼就配置什麼就可以了。

其實仔細想一下最基本的物件導向思想也能想明白,為了解耦和,乙個類或者乙個函式,更應該專注於一件事情,就像乙個伐木工人伐木,伐木工人更希望你給他乙個斧子,而不是他自己去建造一把斧子,然後再去伐木,前者的耦合度是一(伐木),後者的耦合度是二(造斧頭+伐木)  。如果對應到**就是乙個伐木工人類,內部有乙個斧子引用,有乙個伐木方法,這個伐木工人(類)更希望他在伐木前(函式呼叫)就把斧子已經做好了(函式呼叫前被建立而不是函式過程中再建立)

而回到我上面的**中,也正是因為ioc的思想,別人不僅能用我寫的類,不想用了還能替換成他自己的類,這其實也就無形中降低了耦合度,增加了多樣性

耦合是什麼?如何做到解耦?

一 耦合 耦合指的是兩個類之間的聯絡的緊密程度 強耦合 類之間存在著直接關係 弱耦合 在兩個類的中間加入一層,將原來的直接關係變成間接關係,使得兩個類對中間層是強耦合,兩類之間變為弱耦合 二 解耦 1.什麼是解耦 在軟體工程中,降低耦合度即可以理解為解耦,也就是將強耦合變為弱耦合的過程。模組間有依賴...

MySQL是如何做到安全登陸

首先mysql的密碼許可權儲存在mysql.user表中。我們不關注鑑權的部分,我們只關心身份認證,識別身份,後面的許可權控制是很簡單的事情。在mysql.user表中有個authentication string欄位,儲存的是密碼的兩次sha1值。你可以用下面的語句,驗證和mysql.user表中...

web網頁劫持是如何做到的

按照劫持的方法不同,我將劫持分為下面兩類 為了區分哪些是第三方給予導流過來的,通常會在url位址增加類似source from之類的引數,或者進入頁面之前通過 中間頁 種cookie。這樣,當使用者輸入乙個正常 的時候,劫持方會在網路層讓其跳轉到帶分成或者渠道號的 中間頁 或者帶渠道號的頁面。這樣使...