我理解的面向介面程式設計
從題外話說起,在古代沒有貨幣的時候,人們只能用某一樣東西去換取自己需要的另一樣東西。比如,張三需要一匹布,李四需要一頭鵝,正巧張三有一頭鵝,李四有一匹布,於是他們達成了共識,拿布與鵝進行交換,各取所需。但這種交易有很大的弊端,那就是交換物的不確定性,李四想要的是鵝,王五想要的可能是牛,趙六想要的可能是羊。如果張三想要跟不同的人進行交易,那麼他需要準備很多很多的東西。每個人都需要用這種方法進行交易的話,將會特別的混亂和麻煩。於是,作為一般等價物的貨幣誕生了,在一定程度上解決了這種問題。
但是隨著社會的發展進步,現實的貨幣已經不足以滿足人們在交易便捷上的需求。當你要去世界各地旅遊的時候,各個國家和地區的流通貨幣是不一致的,在中國用人民幣,去日本你要用日元,去美國你要用美金,去歐洲你要用歐元,從德國去到英國,你還需要把歐元兌換成英鎊,如果去的地方多了,這麼多個國家的貨幣換來換去也是很不方便的。於是有了虛擬的貨幣形式。現如今,你已經不再需要牽著幾頭牛幾隻羊去跟別人做交換,也不需要帶著各種貨幣,而只要有一張VISA信用卡,去到世界各地,美金你能刷,日元你能刷,歐元你能刷,英鎊你還是能刷,想去哪裡想買什麼你都是刷刷刷,可以說是:一卡在手,走遍世界。是不是覺得很方便。這就實現了:從豬牛羊等實物的交易,到現實貨幣的交易,再到“面向信用卡交易”的轉變。
面向信用卡交易,好處就在於:你不需要知道兩頭牛對應幾隻羊,也不需要在各國的貨幣之間換來換去,你更不需要知道信用卡是如何工作的,你唯一需要確定的,就是你餘額足夠。然後剩下的一切,交給信用卡去完成就可以了。
我把面向介面程式設計中的“面向介面”,理解成為上文所談到的“面向信用卡”,介面就是我們的信用卡。
在面向過程的開發中,上層呼叫下層,上層依賴下層,在“金字塔”的模式下,越往下層就會越龐大,一個上層往往對應很多很多個下層,一旦有一個下層有發生變動,上層也必須作出相應的改變,如果很多很多個下層都發生改變,上層就幾乎是不可維護的。這樣一來,“上層依賴下層”這種依賴關係,會造成很多問題。
因此在面向物件的開發中,採用了“面向介面程式設計”來解決這樣的問題,核心思想是“依賴倒置”:
1、上層的模組不應該依賴於下層的模組,他們都應該依賴於抽象。
也就相當於上面所談到的,我們去世界各地買東西(交易——“上層模組”),不依賴於豬牛羊(貨物——“下層模組”),也不依賴於現實的貨幣(下層模組),我們依賴的是我們的VISA信用卡(抽象)。
2、抽象不應該依賴於具體實現,具體實現應該依賴於抽象。
也就是說,我們的VISA信用卡(抽象)不需要依賴於美元(具體)、日元(具體)、人民幣(具體),而是讓美元、日元、人民幣來依賴信用卡。實際上,也確實如此。
在MVC模式下,“面向介面程式設計”是下圖這樣的關係
在面向介面CustomerDAO之前,CustomerServlet依賴實現類CustomerDAO_impl(JDBC實現類)和CustomerDao_xml_impl(XML實現類),CustomerServlet中的程式碼是這樣的:
下層(實現類)發生了修改,上層(CustomerServlet)也要跟著做出修改。當下層很多,修改很多的時候,上層模組幾乎不可維護。
在面向介面CustomerDAO之後,CustomerServlet中的程式碼是這樣的:
讓下層的具體實現類去依賴介面,通過多型來建立實現類的物件,不管下層(實現類)如何修改,如何增加,上層程式碼(CustomerServlet)都是不需要修改的,這就有了很強的可維護性。