Java设计模式-外观模式
我又來了,繼Java設計模式之橋接模式后,現在來到了外觀模式啦,外觀模式又稱為門面模式啦😁,下面慢慢來啦。
一張舊圖,恍惚間念起舊人
Java設計模式-外觀模式
- 一、前言
- 1)引入:
- 2)概述:
- 3)角色結構:
- 4)使用場景
- 二、案例
- 代碼:
- 三、總結
- 優點:
- 缺點:
- 四、自言自語
一、前言
1)引入:
在以前,手機沒有這么方便的時候,我們一旦需要去哪里哪里辦個什么證,那真就的從這簽個字從那簽個字,簽一路,才能辦下那個證,
比如去辦房產證:
作為懶人的我們,肯定會想要是能有個一站式的就好了。直接一次解決所有問題。
其實,在我們軟件設計當中,也是如此。當一個系統的功能越來越強,子系統會越來越多,客戶對系統的訪問也變得越來越復雜。這時如果系統內部發生改變,客戶端也要跟著改變,這違背了“開閉原則”,也違背了“迪米特法則”,所以有必要為多個子系統提供一個統一的接口,從而降低系統的耦合度,這就是外觀模式的目標。
2)概述:
外觀(Facade)模式又叫作門面模式,是一種通過為多個復雜的子系統提供一個一致的接口,而使這些子系統更加容易被訪問的模式。該模式對外有一個統一接口,外部應用程序不用關心內部子系統的具體細節,這樣會大大降低應用程序的復雜度,提高了程序的可維護性。
外觀(Facade)模式是“迪米特法則”的典型應用。
迪米特法則:又叫作最少知識原則(The Least Knowledge Principle),一個類對于其他類知道的越少越好,就是說一個對象應當對其他對象有盡可能少的了解,只和朋友通信,不和陌生人說話。英文簡寫為: LOD。
3)角色結構:
主要包含以下主要角色。
4)使用場景
(1)設計初期階段,應該有意識的將不同層分離,層與層之間建立外觀模式。(例如:我們平時開發時,controller調用service接口,而不用管serviceImpl的實現是如何的,即三層開發模式。)
(2) 開發階段,子系統越來越復雜,增加外觀模式提供一個簡單的調用接口。
(3) 維護一個大型遺留系統的時候,可能這個系統已經非常難以維護和擴展,但又包含非常重要的功能,為其開發一個外觀類,以便新系統與其交互。
二、案例
【例】智能家電控制
父母年紀大了,平時是我在家的話,這開燈開電視開空調都是父母直接喊我來做的,想著自己離開家了,父母的自己動手,就給父母買了個智能音箱來控制這些。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-n1F81uxz-1628694563887)(C:\Users\ASUS\Desktop\寧在春的學習筆記\JDK8\文檔\Java設計模式-外觀模式.assets\外觀模式.png)]
代碼:
電視類
public class TV {public void on() {System.out.println("打開了電視....");}public void off() {System.out.println("關閉了電視....");} }燈類
public class Light {public void on() {System.out.println("打開了燈....");}public void off() {System.out.println("關閉了燈....");} }空調類
public class AirCondition {public void on() {System.out.println("打開了空調....");}public void off() {System.out.println("關閉了空調....");} }智能音箱
package com.crush.facade;//智能音箱 public class SmartAppliancesFacade {private Light light;private TV tv;private AirCondition airCondition;public SmartAppliancesFacade() {light = new Light();tv = new TV();airCondition = new AirCondition();}public void say(String message) {if (message.contains("開燈")) {onLamp();} else if (message.contains("關燈")) {offLamp();} else if (message.contains("開電視")) {onTV();} else if (message.contains("關電視")) {offTV();} else if (message.contains("開空調")) {onAirCondition();} else if (message.contains("關空調")) {offAirCondition();} else {System.out.println("我還聽不懂你說的!!!");}}private void onLamp() {light.on();}private void offLamp() {light.off();}private void onTV() {tv.on();}private void offTV() {tv.off();}private void onAirCondition() {airCondition.on();}private void offAirCondition() {airCondition.off();} }測試:
//測試類 public class Client {public static void main(String[] args) {//創建外觀對象SmartAppliancesFacade facade = new SmartAppliancesFacade();//客戶端直接與外觀對象進行交互facade.say("打開家電");facade.say("關閉家電");} }這樣就做到了通過一個智能音箱控制全部,而不用管其他的具體實現,只要知道這個接口即可以了。
當然這只是一個體現的外觀模式的小demo,實際中并不全是一樣的,設計模式也是根據實際的軟件設計需求來進行應用的,多數情況下都是幾種設計模式一起用的。
三、總結
優點:
缺點:
四、自言自語
你卷我卷,大家卷,什么時候這條路才是個頭啊。😇(還是直接上天吧)
有時候也想停下來歇一歇,一直做一個事情,感覺挺難堅持的。😁
你好,如果你正巧看到這篇文章,并且覺得對你有益的話,就給個贊吧,讓我感受一下分享的喜悅吧,蟹蟹。🤗
如若有寫的有誤的地方,也請大家不嗇賜教!!
同樣如若有存在疑惑的地方,請留言或私信,定會在第一時間回復你。
持續更新中
總結
以上是生活随笔為你收集整理的Java设计模式-外观模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java设计模式-桥接模式 理论代码相结
- 下一篇: JUC系列(十) | ForkJoin框