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ù)雜的接口或類進(jìn)行隱藏,自己暴露出更為簡單的操作方法,使得以我們不需要去對復(fù)雜方法的操作。就比如要完成一道工序,工序又有許多步驟,在不同情況要使用不同工序的方法,如果是傳統(tǒng)的方式,一個一個調(diào)用,那么到一定量就會顯得調(diào)用的復(fù)雜并且維護(hù)起來困難,因此可以使用外觀模式,將一起使用的方法封裝在一起,這樣只需要調(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鎖的具體使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11
Java多線程--讓主線程等待所有子線程執(zhí)行完畢在執(zhí)行
Java主線程等待所有子線程執(zhí)行完畢在執(zhí)行,其實在我們的工作中經(jīng)常的用到,本篇文章就介紹了Java多線程--讓主線程等待所有子線程執(zhí)行完畢在執(zhí)行,有需要的可以了解一下。2016-11-11
springBoot集成redis(jedis)的實現(xiàn)示例
Redis是我們Java開發(fā)中,使用頻次非常高的一個nosql數(shù)據(jù)庫,本文主要介紹了springBoot集成redis(jedis)的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下2023-09-09
java中continue和break區(qū)別詳細(xì)解析
break和continue都是跳轉(zhuǎn)語句,它們將程序的控制權(quán)轉(zhuǎn)移到程序的另一部分,下面這篇文章主要給大家介紹了關(guān)于java中continue和break區(qū)別的相關(guān)資料,需要的朋友可以參考下2022-11-11

