圖解Java設計模式-外觀模式
阿新 • • 發佈:2021-10-20
一、介紹
外觀模式又叫門面模式,主要包含以下主要角色。
- 外觀(Facade)角色:為多個子系統對外提供一個共同的介面。
- 子系統(Sub System)角色:實現系統的部分功能,客戶可以通過外觀角色訪問它。
- 客戶(Client)角色:通過一個外觀角色訪問各個子系統的功能。
二、使用場景
(1) 開發階段,子系統越來越複雜,增加外觀模式提供一個簡單的呼叫介面。
(2) 維護一個大型遺留系統的時候,可能這個系統已經非常難以維護和擴充套件,但又包含非常重要的功能,為其開發一個外觀類,以便新系統與其互動。
三、使用案例
在日常生活中,我們可以利用小愛音箱去幫我們完成很多操作,比如開關電視、播放音樂、的開關空調,這就是一個外觀模式,讓小愛去幫我們去判斷該做什麼,該怎麼做,我們只需要和小愛音響去對接就行了。
1 public class TV { 2 public void on() { 3 System.out.println("開啟電視"); 4 } 5 6 public void off() { 7 System.out.println("關閉電視"); 8 } 9 }
1 public class AirCondition { 2 public void on() { 3 System.out.println("開啟空調"); 4 } 5 6 public void off() {7 System.out.println("關閉空調"); 8 } 9 }
1 package com.crush.facade; 2 3 //小愛音箱 4 public class SmallLoveFacade { 5 6 private TV tv; 7 private AirCondition airCondition; 8 9 public SmallLoveFacade() { 10 light = new Light(); 11 tv = new TV(); 12 airCondition = newAirCondition(); 13 } 14 15 public void say(String message) { 16 if(message.contains("開電視")) { 17 onTV(); 18 } else if (message.contains("關電視")) { 19 offTV(); 20 } else if (message.contains("開空調")) { 21 onAirCondition(); 22 } else if (message.contains("關空調")) { 23 offAirCondition(); 24 } else { 25 System.out.println("小愛聽不明白你在說什麼"); 26 } 27 } 28 29 private void onTV() { 30 tv.on(); 31 } 32 33 private void offTV() { 34 tv.off(); 35 } 36 37 private void onAirCondition() { 38 airCondition.on(); 39 } 40 41 private void offAirCondition() { 42 airCondition.off(); 43 } 44 }
三、總結
優點:
降低了子系統與客戶端之間的耦合度,使得子系統的變化不會影響呼叫它的客戶類。
對客戶遮蔽了子系統元件,減少了客戶處理的物件數目,並使得子系統使用起來更加容易。
降低了大型軟體系統中的編譯依賴性,簡化了系統在不同平臺之間的移植過程,因為編譯一個子系統不會影響其他的子系統,也不會影響外觀物件。
缺點:
不能很好地限制客戶使用子系統類,很容易帶來未知風險。
增加新的子系統可能需要修改外觀類或客戶端的原始碼,違背了“開閉原則”。
不符合開閉原則,如果要改東西很麻煩,繼承重寫都不合適。