物件導向程式設計思想 外觀模式

2022-01-11 21:17:56 字數 3723 閱讀 3481

一、引言

每逢去吃午飯路上,幾個同事都要討論一番投資理財的事情,時間久之,小白的我才勉強了解到**與**的區別,**是自身直接與某只**交易,可以通過分紅或者低買高賣獲利(自身需要分析**多隻**的**,如圖示一);而**是把錢交給**公司,有專業人員幫你分析**或債券等幫你理財(自身不需要直接關注**了,見圖示二)。

圖示一

圖示二在軟體開發中,客戶端系統經常會與複雜系統的內部子系統進行耦合,從而導致客戶端系統隨著子系統的改變而改變,為了讓客戶端系統與複雜系統的內部子系統解耦,從而有了外觀模式,也稱作「門面模式」,下面將介紹我們今天學習的外觀模式:

二、外觀模式的結構

外觀角色(facade):被客戶client呼叫,知道各個子系統的功能,根據客戶的需要預訂幾種功能的組合

子系統角色(subsystem):完成子系統功能,處理由facade物件分派的任務。對於子系統而言,facade和client角色是未知的

客戶角色(client):通過呼叫facade完成相應的功能

三、外觀模式

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

介紹了外觀模式的定義,下面我們通過兩個例子的對比分析幫助理解外觀模式,先看一下不使用外觀模式時的投資理財demo

//

子系統 **一

class

subsystem1

中的方法

", this

.gettype().name, system.reflection.methodinfo.getcurrentmethod().name));

}public

void

sell()

中的方法

", this

.gettype().name, system.reflection.methodinfo.getcurrentmethod().name));}}

//子系統 **二

class

subsystem2

中的方法

", this

.gettype().name, system.reflection.methodinfo.getcurrentmethod().name));

}public

void

sell()

中的方法

", this

.gettype().name, system.reflection.methodinfo.getcurrentmethod().name));}}

//子系統 **三

class

subsystem3

中的方法

", this

.gettype().name, system.reflection.methodinfo.getcurrentmethod().name));

}public

void

sell()

中的方法

", this

.gettype().name, system.reflection.methodinfo.getcurrentmethod().name));}}

//客戶端呼叫

class

program

}

view code

分析:從上面**可以看出,投資者需要了解每只**的**,每次需要在複雜的**中分析得出最優質的**,然後投資理財

下面看一下使用外觀模式的投資理財demo

//

子系統 **一

class

subsystem1

中的方法

", this

.gettype().name, system.reflection.methodinfo.getcurrentmethod().name));

}public

void

sell()

中的方法

", this

.gettype().name, system.reflection.methodinfo.getcurrentmethod().name));}}

//子系統 **二

class

subsystem2

中的方法

", this

.gettype().name, system.reflection.methodinfo.getcurrentmethod().name));

}public

void

sell()

中的方法

", this

.gettype().name, system.reflection.methodinfo.getcurrentmethod().name));}}

//子系統 **三

class

subsystem3

中的方法

", this

.gettype().name, system.reflection.methodinfo.getcurrentmethod().name));

}public

void

sell()

中的方法

", this

.gettype().name, system.reflection.methodinfo.getcurrentmethod().name));}}

//外觀類 **公司

class

facadesystem

public

void

buy()

public

void

sell()

}//客戶端 投資**, **公司 負責理財

class

program

}

view code

分析:從上面**可以看出,客戶端只依賴外觀類,投資者與**之間的依賴關係解耦了,如果**中某只****改變,此時投資者並不需要改變。

優點:

1.外觀模式對客戶遮蔽子系統元件,簡化了介面,減少了客戶處理的物件數量並使子系統的使用更加容易

2.外觀模式實現子系統和客戶之間的松耦合關係,而子系統內部之間可以是緊耦合的。松耦合使得子系統元件的變化不會影響到它的客戶

缺點:

在不引入抽象外觀類的情況下,增加新的子系統可能需要修改外觀類或客戶端的源**,違反了「開閉原則」

使用場景:

1.為乙個複雜系統提供簡單介面時。使得子系統更具可重用性,更容易 對子系統定製

2.引入facade將這個子系統與客戶以及其它子系統分離,可以提高子系統的獨立性和可移植性

3.當需要構建乙個層次結構的子系統時,使用facade定義每層的入口點。如果子系統之間是相互依賴的,可以讓它們僅通過facade進行通訊,簡化它們之間的依賴關係

物件導向程式設計思想 狀態模式

一 引言 上篇部落格中學習了中介者模式,我們留下了乙個問題,當出現多個玩家需要輸贏狀態條件判斷時,可不可以不去修改中介者類,因為如果每新增乙個條件判斷,就要修改中介者類,破壞了封裝,違背開閉原則。今天我們學習的內容就是要解決這種業務場景,狀態模式 二 狀態模式 定義 當乙個物件的內在狀態改變時允許改...

物件導向程式設計思想 命令模式

一 引言 起初餐館吃飯都是客人和廚師直接溝通,菜譜是一樣的,可是客人多了的時候,有的客人可能有急事不吃了要退單,還有的客人點很多菜需要記錄類別和次序等現象,這時服務員角色的出現解決了問題。那麼面對某些無法抵禦變化的 緊耦合 的場景如何做程式設計呢?命令模式設計便出現了,使得 行為請求者 與 行為實現...

物件導向程式設計思想

舉個最簡單點的例子來區分 有一天要請客吃飯,怎麼辦?有兩個方法 1 買菜,買調料,買肉,買酒水,然後下廚房動手炒菜 2 去飯店,點個 看出來區別了嗎?方法1是面向過程,方法2是物件導向。物件導向有什麼優勢?首先不需要知道各種菜式是怎麼做的,降低了耦合性。如果突然想換 了,對於方法1可能不太容易,因為...