外觀模式 做乙個低調的人

2021-07-17 04:45:54 字數 4617 閱讀 2059

1)概述

外觀模式提供了乙個統一的介面去訪問多個子系統的多個不同的介面。定義乙個高層次的介面,使得子系統更加容易被使用。

外觀模式提供了乙個簡單而且公用的介面去處理複雜的子系統,並且沒有減少子系統的功能。它遮蔽了子系統的複雜性,避免了客戶與子系統直接連線,它減少了子系統與子系統之間的連線,每乙個子系統都有它的facade模式,每個子系統採用facade模式去訪問其他的子系統。外觀模式的缺點是限制了客戶的自由,減少了可變性。

2)提出問題

家興,是乙個非常喜歡打2k(模仿nba比賽的遊戲),相當於**發燒友那樣子,這個月剛發工資,就拿工資去買了一對遊戲手柄,和一台較大的顯示屏,和乙個音響,還買了乙個爆公尺花機(他喜歡遊戲吃爆公尺花)。這些電子裝置剛買回來,家興馬上興致勃勃去裝好這些裝置,好不容易才裝好這些裝置。坐在沙發上,準備開始。。。。。

家興頭痛了,還有做很多任務作:

1.開啟爆公尺花機

2.開始爆公尺花

3.開啟電腦,啟動遊戲

4.開啟遊戲手柄

5.將顯示屏設定電腦輸入

6.開啟音響

7.將功放設定為環繞立體聲

8.調節音響的聲音適中

這只是開始。。。。

還有結束的工作呢。。

如何去解決這樣的問題呢?

3)解決方案

通過使用外觀模式,我們可以建立乙個介面簡化而統一的介面,用來包裝子系統中乙個或多個複雜的類。允許我們讓客戶端和子系統之間避免緊耦合,也可以讓我們滿足乙個新的物件導向。

我們通過原來繁瑣或複雜的過程變得更加簡單,但是呢同時不會對子系統造成什麼影響的。

4)使用場合

1.在設計初期階段,應該要有意識的將不同的兩個層分離,比如經典的三層架構,就需要考慮在資料訪問層和業務邏輯層和表示層的層與層之間建立facade,這樣就可以為複雜的子系統提供乙個簡單的介面,是的耦合大大減低。

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

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

5)結構

client:客戶端類,對facade類進行呼叫,進行開始玩遊戲和不玩遊戲行為

facade:外觀類,外觀模式的核心;對各種子系統的功能使用,來實現各種繁瑣,複雜的行為的效果,減少操作,遮蔽子系統。

popcorn:爆公尺花機類,主要實現爆公尺花各種行為。

computer:電腦類,實現遊戲的相關操作。

gamepad:遊戲手柄類,啟動遊戲手柄,開始遊戲手柄操作。

displayscreen:顯示屏,開顯示屏,調節為電腦訊號輸入等操作。

acoustics:音響類,開啟音響,調節音響的音量

6)外觀模式xml圖

7)**實現

//客戶端類

public

class client

}//外觀類

public

class facade

public

void

playstart()

public

void

playoff()

}//爆公尺花類

public

class popcorn

public

void

palystart()

public

void

playoff()public

class computer

public

void

playstart()

public

void

playend()

public

void

playoff()}}

//電腦類

public

class computer

public

void

playstart()

public

void

playend()

public

void

playoff()

}//遊戲手柄類

public

class gamepad

public

void

playstart()

public

void

playoff()

}//顯示屏類

public

class displayscreen

public

void

playstart()

public

void

getoff()

}//音響類

public

void

geton()

public

void

toning()

public

void

getoff()

}

程式執行結果:

爆公尺花機要開機了

開始炸取爆公尺花

要開電腦了

啟動電腦軟體2k2016,請準備玩遊戲

開啟遊戲手柄!

開始遊戲操作!

啟動顯示屏電源!進入開機狀態!

進入調式進入電腦訊號輸入!

開啟音響裝置!

調節音響裝置的音量適中!

從結果顯示,本來是乙個很繁瑣的行為,結果只是執行facade類的乙個行為就很輕易的實現了,客戶端不需要知道什麼的子系統,只需要呼叫一下就能實現。

8)介面卡和外觀模式之間的差異在於:介面卡包裝乙個類,而外觀模式可以代表許多類?

介面卡模式是講乙個或多個類介面變成客戶所期望的乙個介面。雖然大多數教科書多採用的例子介面卡乙個類,但是你可以適配許多類類提供乙個介面讓客戶編碼。同樣的,乙個外觀模式也可以針對乙個擁有複雜介面的類提供簡化介面。兩種模式的差異在於,不在於他們包裝幾個類,而是在於他們的目的。介面卡是改變介面符合客戶的使用,而外觀模式只是把介面變得更加簡單,並沒有改變。

9)最少知識原則

最少知識原則告訴我們要減少物件之間的互動,只留下幾個密友;只和你的密友交談。

優點:不要讓太多的類耦合在一起,免得修改系統中一部分,會影響其它部分,免得修改系統中一部分,會影響到其他部分。如果許多類之間相互依賴,那麼這個系統就會變成乙個易碎的程式,它需要很多成本維護,也會因為複雜不被別人了解。

缺點:是的,雖然這個原則減少物件之間的依賴,研究顯示這會減少軟體之間的維護成本;但是呢採用這個原則也會導致更多包裝類被製造出來,以處理和其他元件的溝通,這可能會導致複雜度和開發時間增加,並減低執行時的效率。

10)最少知識原則和外觀模式

如果乙個客戶端乙個朋友(乙個facade),這個朋友幫助客戶管理所有子系統元件,它的存在讓客戶變得簡單又有彈性。

我們可以在不影響客戶端的情況下對子系統進行更新或維護等;

我們也可以試著讓子系統也能符合最少原則,如果變得複雜,有太多的朋友牽涉其中,那麼我們可以增加更多的外觀,將次系統分成幾個層次。

11)綜合模式

外觀模式與單例模式:在外觀模式中,通常只需要乙個外觀類,並且此外觀類只有乙個例項,換言之它是乙個單例類。在很多情況下為了節約系統資源,一般將外觀類設計為單例類。當然這並不意味著在整個系統裡只能有乙個外觀類,在乙個系統中可以設計多個外觀類,每個外觀類都負責和一些特定的子系統互動,向使用者提供相應的業務功能。

不要試圖通過外觀類為子系統增加新行為:

外觀模式與最少知識原則:外觀模式創造出乙個外觀物件,將客戶端所涉及的屬於乙個子系統的協作夥伴的數量減到最少,使得客戶端與子系統內部的物件的相互作用被外觀物件所取代。外觀類充當了客戶類與子系統類之間的「第三者」,降低了客戶類與子系統類之間的耦合度,外觀模式就是實現**重構以便達到最少知識原則要求的乙個強有力的**。

抽象模式與外觀模式:外觀模式最大的缺點在於違背了「開閉原則」,當增加新的子系統或者移除子系統時需要修改外觀類,可以通過引入抽象外觀類在一定程度上解決該問題,客戶端針對抽象外觀類進行程式設計。對於新的業務需求,不修改原有外觀類,而對應增加乙個新的具體外觀類,由新的具體外觀類來關聯新的子系統物件,同時通過修改配置檔案來達到不修改源**並更換外觀類的目的。

做乙個正直的人

做乙個正直的人,做乙個人格健全完善的人,受人崇敬。做乙個自私的人,做欺心的事,疾賢防能,與成功無緣。1 己所不欲,勿施於人 2 嫉妒乃方正之人之大忌 3 不做欺心事,本身是一種愉悅 踏踏實實做人,實實在在辦事。任何乙個雙手插在口袋裡的人,都爬不上成功的梯子。給人留下乙個實在的形象,給自己的成功增添乙...

做乙個努力的人

有一次,在我參加的乙個晚會上,主持人問乙個小男孩 你長大以後要做什麼樣的人?孩子看看我們這些企業家,然後說 做企業家。在場的人忽地笑著鼓起了掌。我也拍了拍手,但聽著並不舒服。我想,這孩子對於企業究竟知道多少呢?他是不是因為當著我們的麵才說要當企業家的呢?他是不是受了大人的影響,以為企業家風光,都是有...

做乙個努力的人

有一次,在我加入的乙個晚會上,班主問乙個小男孩 你長大往後要做啥子樣的人?孩子看看我們這些個公司家,而後說 做公司家。現場 的人忽然笑著鼓起了掌。我也拍了拍巴掌,但聽著並不適。我想,這孩子對於公司到底曉得若干呢?他是不是由於當著我們的麵才說要當企 業家的呢?他是不是受了大人的影響,以為公司門風光,都...