Java設(shè)計(jì)模式中的外觀模式詳解
一 定義
外觀(Facade)模式又叫作門面模式,是一種通過為多個(gè)復(fù)雜的子系統(tǒng)提供一個(gè)一致的接口,而使這些子系統(tǒng)更加容易被訪問的模式。該模式對(duì)外有一個(gè)統(tǒng)一接口,外部應(yīng)用程序不用關(guān)心內(nèi)部子系統(tǒng)的具體細(xì)節(jié),這樣會(huì)大大降低應(yīng)用程序的復(fù)雜度,提高了程序的可維護(hù)性。
二 UML類圖
外觀模式是為了解決類與類之家的依賴關(guān)系的,像spring一樣,可以將類和類之間的關(guān)系配置到配置文件中,而外觀模式就是將他們的關(guān)系放在一個(gè)Facade類中,降低了類類之間的耦合度,該模式中沒有涉及到接口,看下類圖:(我們以一個(gè)計(jì)算機(jī)的啟動(dòng)過程為例)
- 外觀類(Facade):為調(diào)用端提供統(tǒng)一的調(diào)用接口,外觀類知道哪些子系統(tǒng)負(fù)責(zé)處理請(qǐng)求,從而將調(diào)用端的請(qǐng)求代理給適當(dāng)子系統(tǒng)對(duì)象
- 調(diào)用者(Client):外觀接口的調(diào)用者
- 子系統(tǒng)的集合:指模塊或者子系統(tǒng),處理Facade 對(duì)象指派的任務(wù),他是功能的實(shí)際提供者
三 代碼實(shí)例
外觀模式可以理解為轉(zhuǎn)換一群接口,客戶只要調(diào)用一個(gè)接口,而不用調(diào)用多個(gè)接口才能達(dá)到目的。比如:在 po
上安裝軟件的時(shí)候經(jīng)常有一鍵安裝選項(xiàng)(省去選擇安裝目錄、安裝的組件等等),還有就是手機(jī)的重啟功能(把關(guān)機(jī)和啟動(dòng)合為一個(gè)操作)。
外觀模式就是解決多個(gè)復(fù)雜接口帶來(lái)的使用困難,起到簡(jiǎn)化用戶操作的作用
示意圖說明
外觀(Facade)角色:為多個(gè)子系統(tǒng)對(duì)外提供一個(gè)共同的接口。
子系統(tǒng)(Sub System)角色:實(shí)現(xiàn)系統(tǒng)的部分功能,客戶可以通過外觀角色訪問它。
客戶(Client)角色:通過一個(gè)外觀角色訪問各個(gè)子系統(tǒng)的功能。
模式的實(shí)現(xiàn)
public class CPU { public void startup(){ System.out.println("cpu startup!"); } public void shutdown(){ System.out.println("cpu shutdown!"); } } public class Memory { public void startup(){ System.out.println("memory startup!"); } public void shutdown(){ System.out.println("memory shutdown!"); } } public class Disk { public void startup(){ System.out.println("disk startup!"); } public void shutdown(){ System.out.println("disk shutdown!"); } } public class Computer { private CPU cpu; private Memory memory; private Disk disk; public Computer(){ cpu = new CPU(); memory = new Memory(); disk = new Disk(); } public void startup(){ System.out.println("start the computer!"); cpu.startup(); memory.startup(); disk.startup(); System.out.println("start computer finished!"); } public void shutdown(){ System.out.println("begin to close the computer!"); cpu.shutdown(); memory.shutdown(); disk.shutdown(); System.out.println("computer closed!"); } } //測(cè)試 public class User { public static void main(String[] args) { Computer computer = new Computer(); computer.startup(); computer.shutdown(); } }
輸出結(jié)果如下:
start the computer!
cpu startup!
memory startup!
disk startup!
start computer finished!
begin to close the computer!
cpu shutdown!
memory shutdown!
disk shutdown!
computer closed!
如果我們沒有Computer類,那么,CPU、Memory、Disk他們之間將會(huì)相互持有實(shí)例,產(chǎn)生關(guān)系,這樣會(huì)造成嚴(yán)重的依賴,修改一個(gè)類,可能會(huì)帶來(lái)其他類的修改,這不是我們想要看到的,有了Computer類,他們之間的關(guān)系被放在了Computer類里,這樣就起到了解耦的作用,這,就是外觀模式!
四 外觀模式的優(yōu)缺點(diǎn)
外觀模式的特點(diǎn):
外觀(Facade)模式是“迪米特法則”的典型應(yīng)用,它有以下主要優(yōu)點(diǎn):
- 降低了子系統(tǒng)與客戶端之間的耦合度,使得子系統(tǒng)的變化不會(huì)影響調(diào)用它的客戶類。
- 對(duì)客戶屏蔽了子系統(tǒng)組件,減少了客戶處理的對(duì)象數(shù)目,并使得子系統(tǒng)使用起來(lái)更加容易。
- 降低了大型軟件系統(tǒng)中的編譯依賴性,簡(jiǎn)化了系統(tǒng)在不同平臺(tái)之間的移植過程,因?yàn)榫幾g一個(gè)子系統(tǒng)不會(huì)影響其他的子系統(tǒng),也不會(huì)影響外觀對(duì)象。
外觀(Facade)模式的主要缺點(diǎn)如下:
- 不能很好地限制客戶使用子系統(tǒng)類,很容易帶來(lái)未知風(fēng)險(xiǎn)。
- 增加新的子系統(tǒng)可能需要修改外觀類或客戶端的源代碼,違背了“開閉原則”。
五 外觀模式的使用場(chǎng)景
通常在以下情況下可以考慮使用外觀模式。
- 對(duì)分層結(jié)構(gòu)系統(tǒng)構(gòu)建時(shí),使用外觀模式定義子系統(tǒng)中每層的入口點(diǎn)可以簡(jiǎn)化子系統(tǒng)之間的依賴關(guān)系。
- 當(dāng)一個(gè)復(fù)雜系統(tǒng)的子系統(tǒng)很多時(shí),外觀模式可以為系統(tǒng)設(shè)計(jì)一個(gè)簡(jiǎn)單的接口供外界訪問。
- 當(dāng)客戶端與多個(gè)子系統(tǒng)之間存在很大的聯(lián)系時(shí),引入外觀模式可將它們分離,從而提高子系統(tǒng)的獨(dú)立性和可移植性。
到此這篇關(guān)于Java設(shè)計(jì)模式中的外觀模式詳解的文章就介紹到這了,更多相關(guān)Java外觀模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java使用Socket判斷某服務(wù)能否連通代碼實(shí)例
這篇文章主要介紹了Java使用Socket判斷某服務(wù)能否連通代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11Java?-jar參數(shù)詳解之掌握J(rèn)ava可執(zhí)行JAR文件的運(yùn)行技巧
做項(xiàng)目的時(shí)候我們肯定接觸過很多jar包,下面這篇文章主要給大家介紹了關(guān)于Java?-jar參數(shù)詳解之掌握J(rèn)ava可執(zhí)行JAR文件的運(yùn)行技巧,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11MyBatis Log 插件無(wú)法顯示SQL語(yǔ)句的原因解析
MyBatis Log是IDEA一款下載量非常高的插件,該插件可以對(duì)控制臺(tái)打印的日志進(jìn)行解析,然后將對(duì)應(yīng)的SQL語(yǔ)句整理并拼接好對(duì)應(yīng)的參數(shù),非常方便。這篇文章給大家介紹MyBatis Log 插件無(wú)法顯示SQL語(yǔ)句的原因,感興趣的朋友跟隨小編一起看看吧2020-09-09jmeter下載及安裝配置教程(win10平臺(tái)為例)
Apache?JMeter是Apache組織開發(fā)的基于Java的壓力測(cè)試工具,Apache?jmeter?可以用于對(duì)靜態(tài)的和動(dòng)態(tài)的資源(文件,Servlet,Perl腳本,java?對(duì)象,數(shù)據(jù)庫(kù)和查詢,F(xiàn)TP服務(wù)器等等)的性能進(jìn)行測(cè)試,本文給大家介紹jmeter下載及安裝配置過程,感興趣的朋友一起看看吧2021-12-12