1. 程式人生 > >設計模式之門面模式(外觀模式) (十一)

設計模式之門面模式(外觀模式) (十一)

說到了門面模式,有些地方又叫做外觀模式,這個模式在平時做Web專案中應該是經常用到,像我們的Service層與DAO層,就是用到了門面模式,Controller層本來是需要跟一個個DAO打交道,但是有了Service層,它直接與DAO打交道,Controller就可以直接使用Service,我們只需專注在Service上寫業務邏輯與操作DAO的各種方法,分離了責任,這個模式我認為最重要的功能就是解耦,降低了系統複雜度。

定義:外觀模式是軟體工程中常用的一種軟體設計模式。它為子系統中的一組介面提供一個統一的高層介面。這一介面使得子系統更加容易使用。

定義與類圖來自百度百科。

我們可以從定義與類圖知道,門面模式就是為所有的子系統提供一個統一的高層的介面,負責子系統集合的功能的使用,下面舉個例子,更清晰的瞭解這個模式。這裡我舉個在京東買鍵盤滑鼠的例子。

首先是各個子系統,也就是各個京東的店家,有賣電腦的實體店,有賣鍵盤的實體店。

package test;

public class ComputerStore {

	public void getComputer() {
		System.out.println("從倉庫裡拿電腦");
	}

	public void sendComputer() {
		System.out.println("讓快遞把電腦寄給買家");
	}

}
package test;

public class KeyboardStore {

	public void getKeyboard() {
		System.out.println("從倉庫裡拿鍵盤");
	}

	public void sendShoes() {
		System.out.println("讓快遞把鍵盤寄給買家");
	}

}

然後就是門面了,也就是某東,客戶端這裡只需要上某東進行購物就可以了。

package test;

public class Jingdong {

	private ComputerStore computerStore;

	private KeyboardStore keyboardStore;

	public Jingdong() {
		computerStore = new ComputerStore();
		keyboardStore = new KeyboardStore();
	}

	public void buyComputer() {

		computerStore.getComputer();
		computerStore.sendComputer();

	}

	public void buyKeyboard() {

		keyboardStore.getKeyboard();
		keyboardStore.sendShoes();

	}

}

下面是客戶端實現

package test;

public class Client {

	public static void main(String[] args) {

		Jingdong jingdong = new Jingdong();
		jingdong.buyComputer();
		jingdong.buyKeyboard();

	}

}

控制檯列印

客戶端是不是很簡單,這裡客戶端只需要跟門面(某東)打交道,不需要本人特地去實體店進行購物,這也體現了網店的便利。如果沒有門面(某東),客戶端需要自己去new一個電腦店,然後再呼叫電腦店的兩個方法,這樣客戶端就依賴具體的子系統(電腦店),其實有做過Web專案的應該都很清楚這個模式,正如開頭所說它讓Controller與DAO解耦,具體的DAO操作SQL查詢的業務邏輯放到了Service這個門面上去實現,具體的客戶端(Controller)只需要呼叫Service這個門面實現好了的方法即可。

在實際使用的時候,介面不是必須的,就像我上面舉的例子,為了便捷就沒寫介面了,實際上根據依賴倒置原則,無論高層的外觀層,還是底層的子系統,都應該依賴於抽象(介面),這會使得程式碼規範,便於維護,面向介面程式設計相信設計模式學到這裡都能感受到其強大之處,但缺點是介面會增多,複雜性就增加了,而且我們會經常給Service裡新增方法,比如查詢XXX,更新XXX,這樣需要經常修改介面,這該怎麼辦呢,一般是等介面的行為穩定的時候,在程式碼重構的階段再決定是否新增抽象的介面,應該是一個解決方式。

注:由於我的水平有限,有些地方說的可能有問題?歡迎大家指出,互相討論互相學習進步!

相關推薦

JAVA設計模式門面模式外觀模式

醫院的例子   現代的軟體系統都是比較複雜的,設計師處理複雜系統的一個常見方法便是將其“分而治之”,把一個系統劃分為幾個較小的子系統。如果把醫院作為一個子系統,按照部門職能,這個系統可以劃分為掛號、門診、劃價、化驗、收費、取藥等。看病的病人要與這些部門打交道,就如同一個子系

設計模式門面模式外觀模式

說到了門面模式,有些地方又叫做外觀模式,這個模式在平時做Web專案中應該是經常用到,像我們的Service層與DAO層,就是用到了門面模式,Controller層本來是需要跟一個個DAO打交道,但是有了Service層,它直接與DAO打交道,Controller就可以直接使用

設計模式門面模式(外觀模式)

門面模式 概念 何時使用 類圖 程式碼例項 概念 當類A和多個類互動時,並且呼叫其方法很亂時,為了降低類之間的耦合性,符合迪米特最少知識法則,專門抽出一個類,並且提供出幾個簡單明瞭的介面給A類,那麼具體的複雜方法呼叫交給此類進行管理,該類就是為門面類。 何時

設計模式總結Facade Pattern外觀模式

目錄 建立型設計模式: 結構型設計模式: 行為型設計模式: Facade Pattern(外觀模式) 意圖 為子系統中的一組介面提供一個一致的介面,Facade模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。適用性 * 當你要為一個複雜子系統提供一個簡單介

設計模式門面模式20170728

問題 中介者模式 oid 功能 外觀 img 單獨 right span 結構型設計模式之門面模式: 一、含義 門面模式也叫做外觀模式,是一種比較常用的封裝模式,其定義如下: 要求一個子系統的外部與其內部的通信必須通過一個統一的對象進行,門面模式提供一個高層次的接口,使得子

C#設計模式五創建者模式Builder【創建型】

包含 direct linq 自然 解釋 並且 宋體 主板 但是 一、引言 今天我們要講講Builder模式,也就是建造者模式,當然也有叫生成器模式的。在現實生活中,我們經常會遇到一些構成比較復雜的物品,比如:電腦,它就是一個復雜的物品,它主要是由CPU、主板、硬盤、顯卡

常用設計模式門面模式

facade int 子模塊 外觀模式 code 原來 外觀 設計模式 同方 門面模式也可以叫做外觀模式 為子系統或者模塊中的一組接口提供一個一致的訪問方式,此模式定義了一個高層接口,這個接口使得各個子系統/模塊中的功能 更加容易使用。 實際應用中,我們在對付一些老舊的代碼

門面模式外觀模式

package archive 相互調用 int 選擇 oid pub href sta 參考:http://www.cnblogs.com/java-my-life/archive/2012/05/02/2478101.html /DesignPatterns/sr

C#設計模式二十三解釋器模式Interpreter Pattern【行為型】

要求 ict string 技術 get protect dict site 關鍵字 原文:C#設計模式之二十三解釋器模式(Interpreter Pattern)【行為型】一、引言 今天我們開始講“行為型”設計模式的第十一個模式,也是面向對象設計模式的最後一個模式,先

Java設計模式五大創建型模式附實例和詳解

caf aac concrete 為什麽 ota pil sem 而不是 rtm 一、概況 總體來說設計模式分為三大類: (1)創建型模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。 (2)結構型模式,共七種:適配器模式、裝飾器模式、代理模式

Java 設計模式 門面模式

RR pla acad cad www. imp inter vat nts http://www.verejava.com/?id=16999102164568 package com.facade.theory; public class TestFacade {

設計模式-門面模式

設計模式之-門面模式(門面模式是給人一種業務程式碼很有層次感,對於內部的實現呼叫者無感知的。是用了主要體現在java的風封裝。) package com.desigin.menmian.impl; import com.desigin.menmian.ICheckMail; public cl

看就懂!【英雄聯盟銳雯】與 Python 詳解設計模式門面模式

【網路配圖】 設計模式(Design Pattern)是一套被反覆使用、多數人知曉的、經過分類的、程式碼設計經驗的總結。使用設計模式的目的:為了程式碼可重用性、讓程式碼更容易被他人理解、保證程式碼可靠性。設計模式使程式碼編寫真正工程化;設計模式是軟體工程的基石脈絡,如同大廈的結構一樣

python設計模式門面模式

一.結構型設計模式 門面模式與單例模式,工廠模式不同,它是一種結構型模式。 結構型模式描述如何將物件和類組合成更大的結構 結構型模式是一種能夠簡化設計工作的模式,它能找出更簡單的方法來認識或表示實體之間的關係。 結構型模式是類和物件模式的綜合體。類模式通過繼承來

設計模式三:單例模式餓漢式與懶漢式

//保證類在記憶體中只有一個物件 package com.xjh.demo.designpattern.pattern3; public class Student { private Student(){ } //懶漢式 priva

《大話設計模式》Java程式碼示例抽象工廠模式

抽象工廠模式(Abstract Factory):提供一個建立一系列相關或相互依賴物件的介面,而無需指定它們具體的類。 package abstractfactory; /** * 抽象工廠方法(Abstract Factory) * 使用者實體類 */ p

Java程式設計師從笨鳥到菜鳥大話設計模式設計模式遵循的七大原則

          最近幾年來,人們踴躍的提倡和使用設計模式,其根本原因就是為了實現程式碼的複用性,增加程式碼的可維護性。設計模式的實現遵循了一些原則,從而達到程式碼的複用性及增加可維護性的目的,設計模式對理解面向物件的三大特徵有很好的啟發,不看設計模式,很難深層地體會到面向物件開發帶來的好處 。在剛開始學習

設計模式【Facade模式外觀模式

Facade模式(外觀模式) 為子系統中的一組介面提供一個統一的介面。Facade模式定義了一個更高層的介面,使系統更容易使用。 Facade模式 關鍵特徵 意圖 希望簡化 原系統的使用方

設計模式享元模式

通過使用池的技術,有效減少了大量細粒度的物件的重複生成。 0x00 組織結構 Flyweight:抽象享元類,聲明瞭可以想外界提供內部狀態的方法,同時還可以設定外部狀態。 ConcreteFlyweight:具體享元類,通常和單例模式組合使用。 U

遊戲中的設計模式外觀模式

寫在前面 在遊戲中一個場景可能需要與多個系統進行資訊互動,比如戰鬥系統,揹包系統,經濟系統等 在編寫程式碼時候勢必要將各個系統之間的通訊和依賴降低到儘可能的小 這時候適合使用外觀模式,將應用程式只能看到外觀(facade)物件,不必理會內部的細節物件,從而降低應用程式的複雜