設計模式之外觀模式

2021-09-21 04:24:42 字數 3542 閱讀 4671

外觀模式(facade)是23種設計模式之一,也稱為門面模式。dp中是這麼定義外觀模式的:

外觀模式為子系統的一組介面提供乙個一致的介面,此模式定義了乙個高層介面,這個介面使得這一子系統更加容易使用。

乙個系統都是由各種大大小小不同功能的類組成的,每乙個類都會提供被外部呼叫的介面,我們可以通過這些介面去使用這些類,但是客戶端要乙個個的去呼叫這些類非常的麻煩,而且也會造成客戶類與子系統類耦合性高的問題,就如下圖:

所以為了解決這種問題,我們需要定義乙個高層介面,讓這個高層介面去完成各個子系統類介面的呼叫,客戶類就只需要對這個高層介面進行呼叫即可,這樣降低了客戶類與子系統類的耦合,也能讓客戶端更加方便的使用這個系統,這就是外觀模式,如下圖:

我們再用電腦來舉個簡單的例子,之所以我們可以很方便的一鍵式的開啟和關閉電腦,就是因為機箱給我們提供了乙個開關按鈕,這個開關按鈕就相當於是乙個高層介面,我們只需要知道按這個按鈕就能開啟電腦,背後的複雜互動我們不需要關心。如果沒有這個統一的開關按鈕,那麼我們想要開啟和關閉電腦就得對硬體乙個個的去操作了,就如下圖:

讓我們使用簡單的**來實現這個場景:

package org.zero01.system;

public

class

cpu public

void

turnoff()}

package org.zero01.system;

public

class

gpu public

void

turnoff()}

package org.zero01.system;

public

class

memory

public

void

turnoff()}

package org.zero01.system;

public

class

disk

public

void

turnoff

()}

使用者**如下:

package org.zero01.user;

import org.zero01.system.cpu;

import org.zero01.system.disk;

import org.zero01.system.gpu;

import org.zero01.system.memory;

public

class

user

}

從使用者呼叫的**上可以看到,需要逐個去例項化各個硬體的物件,然後還得乙個個的去呼叫開關方法很麻煩。

所以我們要利用外觀模式來解決這個問題,先來看看外觀模式的結構圖:

使用**實現這個簡單的結構,子系統類:

class

subsystemone

}class

subsystemtwo

}class

subsystemthree

}class

subsystemfour

}

facade外觀類:

package org.zero01.system;

/** * 外觀類,它需要了解所有子系統類的方法或屬性, 並進行處理、組合,以提供給外部呼叫

*/public

class

facade

public

void

methoda

() public

void

methodb

()}

client客戶端類:

package org.zero01.user;

import org.zero01.system.facade;

/** * 由於facade的作用,客戶端可以根本不知道子系統類的存在,只需要對facade物件進行操作即可

*/public

class

client

}

如上,可以看到,客戶端只需要對facade操作即可,不需要乙個個的去對子系統類進行操作。這種模式用得挺多的,因為它完美的體現了依賴倒轉原則以及迪公尺特法則的思想。

使用外觀模式重構之前的**,增加乙個外觀類:

package org.zero01.system;

public

class

mainswitch

public

void

turnon

() public

void

turnoff

()}

使用者類只需要對這個外觀類進行操作即可,就完成了一鍵式開關機:

package org.zero01.user;

import org.zero01.system.mainswitch;

public

class

user

}

執行結果:

開機-------------

cpu-開

gpu-開

記憶體-開

磁碟-開

關機-------------

cpu-關

gpu-關

記憶體-關

磁碟-關

何時使用外觀模式:至於何時使用外觀模式,可以分為三個階段來說:

1.首先在設計初期階段,應該要有意識的將不同的兩個層分離,比如經典的三層架構,就需要考慮在資料訪問和業務邏輯層、業務邏輯層和表示層的層與層之間建立外觀介面facade,這樣可以為每一層複雜的子系統提供乙個簡單的介面,不僅使得耦合大大降低,也讓外部呼叫更簡單。

2.其次,在開發階段,子系統往往因為不斷的重構演化而變化得越來越複雜,大多數的模式使用時也都會產生很多很小的類,這本是好事,但也會給外部呼叫它們的使用者帶來了使用上的困難,增加外觀facade可以提供乙個簡單的介面,減少它們之間的依賴。

3.第三,在維護乙個遺留的大型系統時,可能這個系統已經非常難以維護和擴充套件了,但因為它包含非常重要的功能,新的需求開發必須要依賴它,此時用外觀模式也是非常適合的。你可以為新系統開發乙個外觀facade類,來為這個設計粗糙或高度複雜的遺留**提供乙個比較清晰簡單的介面,讓新系統與facade物件互動,facade物件則與遺留**互動所有複雜的工作。

設計模式之外觀模式

外觀模式提供了乙個統一的介面,用來訪問子系統中的一群介面。這樣可以避免客戶端和子系統之間的緊耦合。這種模式需要將一系列的子系統組合到外觀中,然後將具體的工作交給各個子系統去完成。如此一來,可以簡化介面的呼叫。其本質就是將系統與客戶端互動的地方封裝起來。這個模式,總體來說,很簡單,理解起來也不困難。依...

設計模式之外觀模式

外觀模式 為子系統中的一組介面提供乙個一直的介面,此模式定義了乙個高層介面,這個介面使得這一子系統更加容易使用。即通過乙個中類來完成客戶端的請求。拿機房收費系統的上機過程來說,上機需要顯示上機者的資訊,填寫上機狀態表,填寫上機記錄表。而使用者不需要知道這些功能是怎麼實現的,只需要通過介面操作就可以完...

設計模式之外觀模式

外觀模式,為子系統中的一組介面提供乙個一致的介面,此模式定義了乙個高層介面,這個介面使得這一子系統更加容易使用。在設計初期階段,應該要有意識的將不同的兩個層分離,比如經典的三層架構,層與層之間建立外觀facade。在開發階段,子系統往往因不斷的重構演化而變得越來越複雜,增加外觀模式可以提供乙個簡單的...