public class Police {
public void checkLetter(){
System.out.println("police檢查");
}
}
門面模式(facade pattern)
定義:提供一個統一的接口去訪問多個子系統的多個不同的接口,它爲子系統中的一組接口提供一個統一的高層接口。使用子系統更容易使用。
按照慣例,先假設一個環境,這裏借用《設計模式之禪》裏面的例子:
假如一個人寫信,從寫信到發送的過程需要如下步驟:
1、寫信(writeLetter)
2、寫地址(fillEnvelope)
3、裝到信封裏(letterIntoEnvolope)
4、發送(sendLetter)
如果按照平常狀態寫代碼,類圖如下:
LetterProcess類
public class LetterProcess implements ILetterProcess {
@Override
public void writeLetter(String letterWord){
System.out.println("寫信:"+letterWord);
}
@Override
public void fillEnvelope(String address){
System.out.println("寫地址:"+address);
}
@Override
public void letterIntoEnvelope(){
System.out.println("裝信封");
}
@Override
public void sendLetter(){
System.out.println("發送");
}
}
public static void main(String[] args) {
ILetterProcess lp = new LetterProcess();
lp.writeLetter("最近過的怎麼樣......");
lp.fillEnvelope("中國北京......");
lp.letterIntoEnvelope();
lp.sendLetter();
}
寫信,寫地址,裝信封,發信的過程都交給了客戶端去實現,不符合高內聚的要求,而且客戶端必須嚴格按照這四個步驟的順序。
那麼如何改進呢?
假設有一家郵局,然後這家郵局說:只要你把內容和地址告訴我,我幫你做這四個步驟,這樣的話,你就省了很多麻煩,而且還有其他好處。
把這四個過程封裝成一個類(PostOffice),由這個類去處理,客戶端只要調用這個類就好了。
PostOffice:
public class PostOffice {
ILetterProcess lp= new LetterProcess();
public void dealLetter(String LetterWord,String address){
lp.writeLetter(LetterWord);
lp.fillEnvelope(address);
lp.letterIntoEnvelope();
lp.sendLetter();
}
}
test:
public static void main(String[] args) {
PostOffice po = new PostOffice();
po.dealLetter("今天天氣還不錯.......", "中國上海.......");
}
門面模式下的類圖:
這樣一看,客戶端是不是省卻了很多麻煩?而郵局說的好處失是什麼呢?
假如有警察需要檢查信封的內容,直接由PostOffice類調用這個類就好了,不需要與客戶端有關。
Police類:
public class Police {
public void checkLetter(){
System.out.println("police檢查");
}
}
PostOffice類:
public class PostOffice {
ILetterProcess lp= new LetterProcess();
Police p = new Police();
public void dealLetter(String LetterWord,String address){
lp.writeLetter(LetterWord);
lp.fillEnvelope(address);
p.checkLetter();
lp.letterIntoEnvelope();
lp.sendLetter();
}
}
類圖:
優點:採用facade模式,封裝一個複雜的運算(或者小系統),降低了依賴關係,使用的時候只需要調用facade模式提供的接口即可,,而無需關心內部實現(有點像函數),符合模塊間的高內聚,低耦合。
缺點:內部功能改變的時候,需要修改代碼,不符合開閉原則。