非官方解讀外觀模式
標簽: 設計模式
外觀模式(Facade) : 外觀模式是為了解決類與類之家的依賴關系的,像spring一樣,可以將類和類之間的關系配置到配置文件中,而外觀模式就是將他們的關系放在一個Facade類中,降低了類類之間的耦合度. 通過一個類持有所有其他類的引用,然后統一整合再調用的處理過程
作者是個二吊子,如果描述有誤請指出.
使用場景
日常編碼中,我們會遇到一個處理分成很多個步驟,而每個步驟是對不同的對象進行了操作.我們就會在代碼中瘋狂調用其他對象操作.這里稱為子系統調用.如果我們這個處理在多個地方用到,是不是就很零散,不方便管理.并且如果后續其中一個子系統發生了變化,我其他的是不是要做相應的處理,比如新增了一個處理或者去除了一個處理.這就違反了開閉.也不滿足復用.由此引出外觀模式
外觀模式
uml圖
子系統:DVDPlayer,Light,Popcorn,Projector,Screen,Stereo
外觀類: HomeTheaterFacade
這里我們按照網上的例子.我們家庭影院的設備眾多,如果我要看電影,那么我就需要打開dvd,打開燈光,打開爆米花機,打開投影,降下屏幕,打開立體聲.然后才能夠看電影.如果每個設備都提供一個單獨的控制器,我們的操作就會非常繁瑣.多看幾次電影估計影院都不要了.由此我們用外觀模式進行統一處理,將功能進行一個整合,對外只通過外觀類進行操作,而外觀類內部封裝了相應子系統的各種調用邏輯.這樣也提供了一個緩沖層,后續有修改我們可以修改一個地方即可.
/**
* @Description: dvd
* @Author: gaofan
* @Date: 2020/3/23 15:39
* @Copyright: 2020 www.withu.top Inc. All rights reserved.
**/
public class DVDPlayer {
public static DVDPlayer instance = new DVDPlayer();
public static DVDPlayer getInstance() {
return instance;
}
public void turnOn() {
System.out.println("DVD打開了");
}
public void turnOff() {
System.out.println("DVD關閉了");
}
public void play() {
System.out.println("DVD開始播放了");
}
public void pause() {
System.out.println("DVD暫停播放了");
}
}
/**
* @Description: 燈光
* @Author: gaofan
* @Date: 2020/3/23 15:45
* @Copyright: 2020 www.withu.top Inc. All rights reserved.
**/
public class Light {
public static Light instance = new Light();
public static Light getInstance() {
return instance;
}
public void turnOn() {
System.out.println("打開燈光");
}
public void turnOff() {
System.out.println("關閉燈光");
}
}
/**
* @Description: 爆米花
* @Author: gaofan
* @Date: 2020/3/23 15:41
* @Copyright: 2020 www.withu.top Inc. All rights reserved.
**/
public class Popcorn {
public static Popcorn instance = new Popcorn();
public static Popcorn getInstance() {
return instance;
}
public void turnOn() {
System.out.println("開始制作爆米花");
}
public void turnOff() {
System.out.println("爆米花機關閉了");
}
public void pop() {
System.out.println("爆米花制作完成");
}
}
/**
* @Description: 投影儀
* @Author: gaofan
* @Date: 2020/3/23 15:42
* @Copyright: 2020 www.withu.top Inc. All rights reserved.
**/
public class Projector {
public static Projector instance = new Projector();
public static Projector getInstance() {
return instance;
}
public void turnOn() {
System.out.println("投影儀打開了");
}
public void turnOff() {
System.out.println("投影儀關閉了");
}
public void focus() {
System.out.println("投影儀聚焦了");
}
}
/**
* @Description: 屏幕
* @Author: gaofan
* @Date: 2020/3/23 15:43
* @Copyright: 2020 www.withu.top Inc. All rights reserved.
**/
public class Screen {
public static Screen instance = new Screen();
public static Screen getInstance() {
return instance;
}
public void turnUp() {
System.out.println("屏幕上升");
}
public void turnDown() {
System.out.println("屏幕下降");
}
}
/**
* @Description: 立體聲
* @Author: gaofan
* @Date: 2020/3/23 15:44
* @Copyright: 2020 www.withu.top Inc. All rights reserved.
**/
public class Stereo {
public static Stereo instance = new Stereo();
public static Stereo getInstance() {
return instance;
}
public void turnOn() {
System.out.println("打開立體聲");
}
public void turnOff() {
System.out.println("關閉立體聲");
}
}
類型: 外觀模式
原理: 以外觀類進行統一調用,讓其中具體的調用邏輯透明,用戶不需要關心內部具體的子系統調用過程,可以進行直接使用.后續如果需要修改或者新增可以非常方便.
瞎掰扯: 我們在工程中其實用到了很多類似外觀模式,比如我們一個controller接收到一個請求后進行處理,但是處理的過程非常多,我們就用一個service進行封裝,具體的子系統調用以及邏輯躲在service層中處理,我們對外只提供service接口,你只需要知道service的存在即可.這其實就是一種外觀模式.service中處理的類我們也能看做外觀類.它是打包了一系列操作的.
本文借鑒尚硅谷Java設計模式,韓順平圖解java,傳送門
智能推薦
YEOMAN官方文檔非官方翻譯~快速使用(codelab)
在25分鐘的 codelab(編碼實驗) 中,你將在 Yeoman、FountainJS 的幫助下,通過腳手架構建起一個功能完整的web應用。這個簡單的應用將會用 React、Angular2、Angular1 來編寫。 不知道 React 或者 Angular?沒關系,我們將會幫您渡過難關。然而,我們必須假定你先前已經有了一些 JavaScript 的編程經驗。 通過Yeoman構建這個簡單的應...
Qt 圖像疊加模式[composition Modes]官方例子 源碼解讀
前言: 看 qt 的例子 看到個有意思的 圖片質量有壓縮 看起來不美 這個代碼 比我們平常看到的要復雜一點 能學到東西 我把源碼看了一下 在這里在仔細整理說一下 composition 項目結構 一個 shared 文件夾 幾個類 注意 這個 hoverpoints 類沒有用到 因為我沒有開啟 opengl 兩個資源文件 一些美化控件的圖片 兩種 底色圖片 就是那個背景花 一個 html 里面是介...
外觀模式
1、外觀模式簡述 外觀模式隱藏系統的復雜性,并向客戶端提供了一個客戶端可以訪問系統的接口。這種類型的設計模式屬于結構型設計模式,提供了客戶端請求的簡化方法和對現有系統類方法的委托調用。簡單來說就是封裝子系統,簡化子系統調用。 2、UML類圖 3、具體實現 ...
外觀模式
Facade 為一組具有類似功能的類群,提供一個一致的簡單界面。 角色和職責 1.Facade 為調用方定義簡單的調用接口 2.Clients 調用者。通過Facade接口調用提供某功能的內部類群 3.Packages 功能提供者,指提供功能的類群(模塊或子系統)...
外觀模式
簡述 外觀模式(Facade Pattern)隱藏系統的復雜性,并向客戶端提供了一個客戶端可以訪問系統的接口。這種類型的設計模式屬于結構型模式,它向現有的系統添加一個接口,來隱藏系統的復雜性。 這種模式涉及到一個單一的類,該類提供了客戶端請求的簡化方法和對現有系統類方法的委托調用。 角色 Facade:為子系統提供一個共同的對外接口。知道哪些子系統負責處理請求,將客戶端的請求分派給相應的子系統。 ...
猜你喜歡
外觀模式
定義 外觀模式:為子系統中的一組接口提供一個一致的界面,此模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。 結構圖 具體編碼 子系統們: SubSystemOne類 SubSystemTwo 類: SubSystemThree 類: SubSystemFour 類: 外觀類: 它需要了解所有的子系統的方法,進行組合,以備外界調用...
外觀模式
外觀模式 定義(來自維基百科) 外觀模式(Facade pattern)<[f?'sɑd] ['pæt?n]>又名“門面模式”,其為子系統中的一組接口提供一個統一的高層接口,使得子系統更容易使用。 圖示 應用外觀模式之前 應用外觀模式之后 解讀 外觀模式也是得墨忒耳定律(Law of Demeter)/迪米特法則的實現,根據單一職責原則,在軟件中將一...
外觀模式
外觀模式 標簽 : Java與設計模式 外觀模式: 又稱門面模式: 外觀Facade為子系統的一組接口提供一個一致界面,使得這組子系統易于使用(通過引入一個新的外觀角色降低原系統復雜度,同時降低客戶類與子系統的耦合度). 圖片來源: 設計模式: 可復用面向對象軟件的基礎. 實現 有過自己找房租房經歷的同學能夠體會得到找房是件很痛苦的事, 不光要挨個小區跑而且還要跟(二)房東討價還價. 于是后來學聰...
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...