Java設(shè)計模式之淺談外觀模式
簡介
外觀模式(Facade Pattern)隱藏系統(tǒng)的復(fù)雜性,并向客戶端提供了一個客戶端可以訪問系統(tǒng)的接口。這種類型的設(shè)計模式屬于結(jié)構(gòu)型模式,它向現(xiàn)有的系統(tǒng)添加一個接口,來隱藏系統(tǒng)的復(fù)雜性。
這種模式涉及到一個單一的類,該類提供了客戶端請求的簡化方法和對現(xiàn)有系統(tǒng)類方法的委托調(diào)用。
外觀模式之理解
對于外觀模式,我們可以理解為他是將一些復(fù)雜的接口或類進行隱藏,自己暴露出更為簡單的操作方法,使得以我們不需要去對復(fù)雜方法的操作。就比如要完成一道工序,工序又有許多步驟,在不同情況要使用不同工序的方法,如果是傳統(tǒng)的方式,一個一個調(diào)用,那么到一定量就會顯得調(diào)用的復(fù)雜并且維護起來困難,因此可以使用外觀模式,將一起使用的方法封裝在一起,這樣只需要調(diào)用這個外觀的方法即可完成。
我們看一下外觀模式的UML圖:
實例
采用智能家居的例子來理解外觀模式,例子很簡單,當(dāng)我們按下一鍵啟動開關(guān),就可以為我們打開/關(guān)閉窗戶、電視、空調(diào)、燈光等。
先看一些類圖:
具體代碼如下:
①、定義子系統(tǒng)
子系統(tǒng)分為:燈光、空調(diào)、電視、窗戶。采用單例模式,并且聲明開啟、關(guān)閉的方法。
這里只粘貼一個,其他的代碼類似。
package com.lyd.demo.subsystem; /** * @Author: lyd * @Description: 子系統(tǒng) - 空調(diào) * @Date: 2022-08-31 */ public class AirConditioner { private static AirConditioner airConditioner = new AirConditioner(); public static AirConditioner getAirConditioner() { return airConditioner; } public void on() { System.out.println("智能家居為您打開[空調(diào)]"); } public void off() { System.out.println("智能家居為您關(guān)閉[空調(diào)]"); } }
②、外觀類
采用單例模式,實例化對象,并且根據(jù)需要去調(diào)用方法,暴露出接口即可完成,這里是啟動所有設(shè)備,還可以根據(jù)需要去選擇。
package com.lyd.demo.faced; import com.lyd.demo.subsystem.AirConditioner; import com.lyd.demo.subsystem.Lights; import com.lyd.demo.subsystem.Tv; import com.lyd.demo.subsystem.Windows; /** * @Author: lyd * @Description: 外觀模式 * @Date: 2022-08-31 */ public class SmartHomeFaced { private Lights[] lights = new Lights[4]; // 4盞燈 private Tv tv; private AirConditioner airConditioner; private Windows windows; public SmartHomeFaced() { this.lights[0] = Lights.getLights(); this.lights[1] = Lights.getLights(); this.lights[2] = Lights.getLights(); this.lights[3] = Lights.getLights(); this.tv = Tv.getTv(); this.airConditioner = AirConditioner.getAirConditioner(); this.windows = Windows.getWindows(); } public void openAll() { lights[0].on(0); lights[1].on(1); lights[2].on(2); lights[3].on(3); tv.on(); airConditioner.on(); windows.on(); } public void offAll() { lights[0].off(0); lights[1].off(1); lights[2].off(2); lights[3].off(3); tv.off(); airConditioner.off(); windows.off(); } }
③、測試
調(diào)用外觀暴露的接口方法就可以。
package com.lyd.demo.test; import com.lyd.demo.faced.SmartHomeFaced; /** * @Author: lyd * @Description: 測試 * @Date: 2022-08-31 */ public class FacedTest { public static void main(String[] args) { SmartHomeFaced smartHomeFaced = new SmartHomeFaced(); smartHomeFaced.openAll(); smartHomeFaced.offAll(); } }
運行結(jié)果:
好文推薦
- 阿里云 - 開發(fā)者社區(qū) https://developer.aliyun.com/article/420326
- 掘金 https://juejin.cn/post/6844903680303431693
今天的內(nèi)容還算是簡單好理解的,多看看,多動手理解就會更快!
??創(chuàng)作不易,可能有些語言不是很通暢,如有錯誤請指正,感謝觀看!記得一鍵三連哦!??
到此這篇關(guān)于Java設(shè)計模式之外觀模式的文章就介紹到這了,更多相關(guān)Java設(shè)計模式之外觀模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot之返回json數(shù)據(jù)的實現(xiàn)方法
這篇文章主要介紹了SpringBoot之返回json數(shù)據(jù)的實現(xiàn)方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12淺談Java并發(fā)中ReentrantLock鎖應(yīng)該怎么用
本文主要介紹了ava并發(fā)中ReentrantLock鎖的具體使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11Java多線程--讓主線程等待所有子線程執(zhí)行完畢在執(zhí)行
Java主線程等待所有子線程執(zhí)行完畢在執(zhí)行,其實在我們的工作中經(jīng)常的用到,本篇文章就介紹了Java多線程--讓主線程等待所有子線程執(zhí)行完畢在執(zhí)行,有需要的可以了解一下。2016-11-11springBoot集成redis(jedis)的實現(xiàn)示例
Redis是我們Java開發(fā)中,使用頻次非常高的一個nosql數(shù)據(jù)庫,本文主要介紹了springBoot集成redis(jedis)的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下2023-09-09