【java】設計模式之門面模式

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("發送");
	}
}


test

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模式提供的接口即可,,而無需關心內部實現(有點像函數),符合模塊間的高內聚,低耦合。

缺點:內部功能改變的時候,需要修改代碼,不符合開閉原則。

發佈了43 篇原創文章 · 獲贊 7 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章