這兩天剛把適配器模式與外觀模式學習了一遍,記錄一下自己在學習中的思考。 適配器設計模式與外觀設計模式所涉及到的一個設計原則: 最少知識原則:不要讓太多的類耦合在一起,以免當修改了某一部分後,會影響到其他部分。 對於任何對象而言,在該對象的方法內,其中最少所指的範圍: 1. 該對象本身; 2.被當作方 ...
這兩天剛把適配器模式與外觀模式學習了一遍,記錄一下自己在學習中的思考。
適配器設計模式與外觀設計模式所涉及到的一個設計原則:
最少知識原則:不要讓太多的類耦合在一起,以免當修改了某一部分後,會影響到其他部分。
對於任何對象而言,在該對象的方法內,其中最少所指的範圍:
1. 該對象本身;
2.被當作方法的參數傳遞進來的對象
------------------------------------(以上兩點比較好理解,完全字面意思)
3. 此方法所創建或實例化的任何對象
即在方法中,通過構造器生成的一個其他類的對象,在方法中使用這個對象是滿足最小知識的原則的;
但是,假如在方法中,通過其他類的非構造器方法返回的類對象,根據該原則是不建議去調用此對象的相關方法的。
4. 對象的任何組件
包括對象所處的類的其他方法,屬性
一. 適配器模式
在接觸Java這門編程語言的時候,看著視頻教程,學到過有關適配器模式的相關內容,可是當時自己完全弄不明白(即使到現在,自己依舊有許多不明白的地方),也許是剛接觸的原因,經驗不足,缺乏實踐的學習使得自己在學的時候,總會把許多理念搞混。
說到適配器設計模式,其實分為兩類,一種是對象適配器,另一種是類適配器(但Java中這種方式是無法實現的)。搞清楚適配器模式,我個人認為最重要的就是分清楚適配對象是誰,被適配對象是誰。簡單的說:適配對象就是我想要訪問與使用的類,被適配對象則是實際提供功能的類。拿快被用爛的插座的例子來說:
首先是被適配對象--三孔插座:
假設,我想要連上電源的是一個兩孔的(嗯。。。比如兩孔的落地式電風扇)
即目標對象(適配對象)--兩孔插頭:
所以需要適配器,讓兩孔的插頭插在適配器上,然後,再將適配器插在三孔的插座上。那麼,也就是說適配器會具有兩孔的孔洞以及三角的插頭,適配器與被適配對象以及目標對象都有聯繫。
接著回到程式:
適配器與兩者都具有關係,但是使用者用的是兩孔的插頭(即目標對象),那麼,從聯繫上說,目標對象與適配器其實是屬於一類的,考慮到目標對象可以不止一類,那就可以考慮將目標對象抽象為一個介面(一個兩孔插頭的介面),而適配器則實現了這個介面,這樣,對於使用者而言,其實他只知道自己在使用目標對象(即兩孔的插座);同時,適配器也要具有被適配對象的能力(即使用三孔插座的能力)
在對象適配器中,利用組合的形式,將被適配對象作為適配器的一個屬性,在調用相關方法的時候,實際上是被適配對象在調用它自身的相對應的方法。
好吧,其實說了那麼多,還不如畫個UML圖來的實際:
以上就是對象適配器。另外再說一下類適配器,其類結構圖如下:
由於在Java中,類只能繼承一個,所以說在Java中實現不了
二. 外觀模式
首先先聊一下什麼是外觀模式,剛開始看到這個模式的時候我以為是什麼特別厲害的模式,可隨著學習的深入,我才發現原來自己早就開始使用外觀模式了,只是自己之前不知道怎麼一回事。在Effective Java 一書中提到過,在工作中,儘可能的多使用組合,減少繼承的使用次數,而外觀模式,則是大量的利用了組合。
外觀模式是指提供一個統一的介面,用來訪問子系統中的一群介面,外觀定義了一個更高一級的介面,讓子系統更加容易的使用。
作用:為了簡化介面,在提供簡化介面的同時,依然將系統完整的功能暴露出來
舉個簡單的例子,以洗衣機為例:如今用洗衣機洗衣服一共需要幾步?
1.把衣服放進去;2.倒上洗衣液;3.啟動洗衣程式;4;將甩乾的衣服拿出去曬了。
可是幾年前的洗衣機就沒那麼只能,第三步需要加入人為的干預,例如將洗好的衣服放到另一個滾筒里甩乾。
所以洗衣程式就是那個更高一級的介面,負責接管底下子系統的功能,減少人工干預。
這也讓我想起了工作中遇到的一件事:之前在開發一項功能的時候需要使用產品客戶端的cookie,為了防止每一次要用到cookie的時候都去申請一遍,我的一位前輩就讓我將cookie值存到緩存中,實現並不複雜,剛開始的設計就是我去申請cookie,然後存到緩存中,其他人調用從緩存中獲取cookie的方法,如果cookie獲取不到,或是失效了,他們再調用我寫的申請cookie的方法,結果我將這個方案提出來後就被否決了,前輩給出了兩個意見:
1.先寫介面,不要一開始就直接實現;2.只需要給我一個方法就行,調用者不需要去關心cookie拿不到的問題,所有工作都在內部實現。
現在想來這不就是外觀設計模式嗎,提供一個更高一級的介面,提供調用方法,調用者不需要操心底層的實現。
三. 兩計模式的比較
適配器模式:其功能是將一個不滿足客戶需求的介面,轉換為一個用戶可以正常使用的介面,適配器可以將 一個或多個類介面變為一個所需要的介面(不一定說一個適配器對應一個要適配的類)
外觀模式:其功能是為功能繁雜的子系統提供一個簡化的介面。
裝飾者模式:其是將一個對象包裝起來以增加新的行為,但是無法在原有介面的基礎上改變介面的相關功能。