PS一句:最終還是選擇CSDN來整理發表這幾年的知識點,該文章平行遷移到CSDN。因為CSDN也支援MarkDown文法了,牛逼啊!
【工匠若水 http://blog.csdn.net/yanbober】 閱讀前一篇《設計模式(結構型)之裝飾者模式(Decorator Pattern)》http://blog.csdn.net/yanbober/article/details/45395747
概述
一個客戶類需要和多個業務類互動,而這些業務類經常會作為整體出現,由于涉及到的類比較多,導緻使用時代碼較為複雜。外觀模式通過引入一個新的外觀類(Facade)來實作該功能,外觀類為多個業務類的調用提供統一入口,簡化了類與類之間的互動。如果沒有外觀類,那麼每個客戶類需要和多個業務類之間進行複雜的互動,系統的耦合度将很大。外觀模式是迪米特法則的一種具體實作,通過引入一個新的外觀角色可以降低原有系統的複雜度,同時降低客戶類與子系統的耦合度。
核心
概念: 為子系統中的一組接口提供一個統一的入口。外觀模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。
重點: 外觀模式結構重要核心子產品:
外觀角色
用戶端可以調用它的方法,在外觀角色中可以知道相關子系統的功能和責任;在正常情況下,它将所有從用戶端發來的請求委派到相應的子系統去,傳遞給相應的子系統對象處理。
子系統角色
在軟體系統中可以有一個或者多個子系統角色,每一個子系統可以不是一個單獨的類,而是一個類的集合,它實作子系統的功能;每一個子系統都可以被用戶端直接調用,或者被外觀角色調用,它處理由外觀類傳過來的請求;子系統并不知道外觀的存在,對于子系統而言,外觀角色僅僅是另外一個用戶端而已。
使用場景
需要通路一系列複雜的子系統時提供一個簡單入口。
用戶端程式與多個子系統之間存在很大的依賴性。引入外觀類可以将子系統與用戶端解耦,進而提高子系統的獨立性和可移植性。
在階層化結構中,可以使用外觀模式定義系統中每一層的入口,層與層之間不直接産生聯系,而通過外觀類建立聯系,降低層之間的耦合度。
程式猿執行個體
這裡還是以苦逼的程式猿為例來說明外觀模式。一個Android開發者開發Android程式需要很多工具條件,電腦,軟體,網絡。如下實作:
package yanbober.github.io;
//子系統角色
class Computer {
public void thinkpad() {
System.out.println("Computer is ThinkPad!");
}
}
class EathNet {
public void net() {
System.out.println("Net is CMCC!");
}
}
class DeveloperTools {
public void tools() {
System.out.println("Developer Tool is Android Studio!");
}
}
//外觀角色
class AndroidDeveloperEquipment {
public void equipment() {
new Computer().thinkpad();
new EathNet().net();
new DeveloperTools().tools();
}
}
public class Main {
public static void main(String[] args) {
AndroidDeveloperEquipment dev = new AndroidDeveloperEquipment();
dev.equipment();
}
}
總結一把
外觀模式優點:
- 減少用戶端所需處理的對象數目,使得子系統使用起來更加容易。
- 實作了子系統與用戶端之間的松耦合關系。
- 一個子系統的修改對其他子系統沒有任何影響,而且子系統内部變化也不會影響到外觀對象。
外觀模式缺點:
- 不能很好地限制用戶端直接使用子系統類,如果對用戶端通路子系統類做太多的限制則減少了可變性和靈活性。
- 如果設計不當,增加新的子系統可能需要修改外觀類的源代碼,違背了開閉原則。
【工匠若水 http://blog.csdn.net/yanbober】 繼續閱讀《設計模式(結構型)之享元模式(Flyweight Pattern)》 http://blog.csdn.net/yanbober/article/details/45477551