設計模式(12) 介面隔離模式(1) 外觀模式

2021-09-25 15:33:51 字數 3258 閱讀 6546

目錄

0.介面隔離模式

1.基本介紹

2.動機

3.類圖

4.案例:影院管理專案

5.外觀模式在mybatis原始碼中的應用

6.總結

在元件構建過程中,某些介面之間直接的依賴常常會帶來很多問題、甚至根本無法實現。採用新增一層間接(穩定)介面,來隔離本來互相緊密關聯的介面是一種常見的解決方案

典型模式:

其實,間接的思想充斥著計算機的設計,比如c++中的指標就是物件的間接,從更巨集大的層面來看,

定義:如同生活中的電腦,手機,內部極其複雜,多個複雜介面相互連線,但是對於使用者來說他們只需要觸碰外部裝置或外殼就能訪問內部,而外觀模式就是解決多個複雜介面帶來的使用困難,起到簡化使用者操作的作用

上述a方案中的問題在於元件的客戶和元件中各種複雜的子系統有了過多的耦合,隨著外部客戶程式和各子系統的演化,這種過多的耦合面臨很多變化的挑戰

如何簡化外部客戶程式和系統間的互動介面?如何將外部客戶程式的演化和內部子系統的變化之間的依賴相互解耦?

組建乙個家庭影院:

傳統解決方案:

分析這種方案的問題:

解決思路:

外觀模式實現:

//開啟

public void on()

//關閉

public void off()

public void play()

//暫停

public void pause()

}

package cn.cqu.facade;

//爆公尺花機

public class popcorn

public static popcorn getinstance()

//開啟

public void on()

//關閉

public void off()

//爆爆公尺花

public void pop()

}

package cn.cqu.facade;

//投影儀

public class projector

public static projector getinstance()

//開啟

public void on()

//關閉

public void off()

//聚焦

public void focus()

}

package cn.cqu.facade;

//螢幕

public class screen

public static screen getinstance()

//上公升

public void up()

//下降

public void down()

}

package cn.cqu.facade;

public class stereo

public static stereo getinstance()

//開啟

public void on()

//關閉

public void off()

//調大

public void up()

//調小

public void down()

}

package cn.cqu.facade;

//影院燈光

public class theatrelight

public static theatrelight getinstance()

//開啟

public void on()

//關閉

public void off()

//調亮

public void bright()

//調暗

public void dim()

}

package cn.cqu.facade;

public class hometheatrefacade

//操作分成四個步驟

//準備

public void ready()

public void play()

//暫停

public void pause()

//結束

對上述原始碼的類**釋:

設計模式 2 介面隔離原則

介面 inte ce inte ce1 class bimplements inte ce1 public void operation2 public void operation3 public void operation4 public void operation5 class dimpl...

設計模式 二 介面隔離原則

要求程式設計師盡量將臃腫龐大的介面拆分成更小的和更具體的介面,讓介面中只包含客戶端感興趣的方法。客戶端不應該被迫依賴於它不使用的方法。即,乙個類對另乙個類的依賴應該建立在最小的介面上。上面的說法可能比較籠統,難以理解。下面就舉例說明 a類中的某個方法或者建構函式,引數需要傳入乙個介面實現類b,這就是...

設計模式基礎1 介面

a 使用場景 解決多重繼承和client需要多service provider的支援。b 典型uml c 舉例 薪水計算類的設計 不同的類別有不同的薪水計算方法,那麼getsalary方法可以抽象到乙個介面salarycalculator內,這樣在client進行呼叫時就會有多型的效果 d 分析總結...