外觀模式(Facade)
意圖
為子系統中的一組介面提供統一介面。Facade定義了一個更高階別的介面,使子系統更易於使用。
解釋
金礦是如何運作的?”礦工們去金礦挖金子!”你說。之所以如此是因為你使用的是一個簡單的介面,金礦是外部提供,在它內部必須做很多事才能實現。到複雜子系統的這個簡單介面是一個外觀。
簡單來說
Facade模式為複雜的子系統提供了簡化的介面。
維基百科說
外觀是一個物件,它為更大的程式碼體(如類庫)提供了簡化的介面。
程式化示例
以上面的金礦為例。在這裡,我們有礦工層次結構
public abstract class DwarvenMineWorker { private static final Logger LOGGER = LoggerFactory.getLogger(DwarvenMineWorker.class); public void goToSleep() { LOGGER.info("{} goes to sleep.", name()); } public void wakeUp() { LOGGER.info("{} wakes up.", name()); } public void goHome() { LOGGER.info("{} goes home.", name()); } public void goToMine() { LOGGER.info("{} goes to the mine.", name()); } private void action(Action action) { switch (action) { case GO_TO_SLEEP: goToSleep(); break; case WAKE_UP: wakeUp(); break; case GO_HOME: goHome(); break; case GO_TO_MINE: goToMine(); break; case WORK: work(); break; default: LOGGER.info("Undefined action"); break; } } public void action(Action... actions) { for (Action action : actions) { action(action); } } public abstract void work(); public abstract String name(); static enum Action { GO_TO_SLEEP, WAKE_UP, GO_HOME, GO_TO_MINE, WORK } } public class DwarvenTunnelDigger extends DwarvenMineWorker { private static final Logger LOGGER = LoggerFactory.getLogger(DwarvenTunnelDigger.class); @Override public void work() { LOGGER.info("{} creates another promising tunnel.", name()); } @Override public String name() { return "Dwarven tunnel digger"; } } public class DwarvenGoldDigger extends DwarvenMineWorker { private static final Logger LOGGER = LoggerFactory.getLogger(DwarvenGoldDigger.class); @Override public void work() { LOGGER.info("{} digs for gold.", name()); } @Override public String name() { return "Dwarf gold digger"; } } public class DwarvenCartOperator extends DwarvenMineWorker { private static final Logger LOGGER = LoggerFactory.getLogger(DwarvenCartOperator.class); @Override public void work() { LOGGER.info("{} moves gold chunks out of the mine.", name()); } @Override public String name() { return "Dwarf cart operator"; } } |
為了操作這些金礦工人,我們擁有 facade
public class DwarvenGoldmineFacade { private final List<DwarvenMineWorker> workers; public DwarvenGoldmineFacade() { workers = new ArrayList<>(); workers.add(new DwarvenGoldDigger()); workers.add(new DwarvenCartOperator()); workers.add(new DwarvenTunnelDigger()); } public void startNewDay() { makeActions(workers, DwarvenMineWorker.Action.WAKE_UP, DwarvenMineWorker.Action.GO_TO_MINE); } public void digOutGold() { makeActions(workers, DwarvenMineWorker.Action.WORK); } public void endDay() { makeActions(workers, DwarvenMineWorker.Action.GO_HOME, DwarvenMineWorker.Action.GO_TO_SLEEP); } private static void makeActions(Collection<DwarvenMineWorker> workers, DwarvenMineWorker.Action... actions) { for (DwarvenMineWorker worker : workers) { worker.action(actions); } } } |
現在使用 facade
DwarvenGoldmineFacade facade = new DwarvenGoldmineFacade(); facade.startNewDay(); // Dwarf gold digger wakes up. // Dwarf gold digger goes to the mine. // Dwarf cart operator wakes up. // Dwarf cart operator goes to the mine. // Dwarven tunnel digger wakes up. // Dwarven tunnel digger goes to the mine. facade.digOutGold(); // Dwarf gold digger digs for gold. // Dwarf cart operator moves gold chunks out of the mine. // Dwarven tunnel digger creates another promising tunnel. facade.endDay(); // Dwarf gold digger goes home. // Dwarf gold digger goes to sleep. // Dwarf cart operator goes home. // Dwarf cart operator goes to sleep. // Dwarven tunnel digger goes home. // Dwarven tunnel digger goes to sleep. |
適用場景
- 您想為複雜的子系統提供簡單的介面。子系統隨著它們的發展變得越來越複雜。大多數模式在應用時會導致更多更小的類。這使得子系統更易於重複使用並且更易於自定義,但對於不需要自定義它的客戶端也變得更難使用。外觀模式可以提供子系統的簡單預設檢視,對大多數客戶端來說足夠好。只有需要更多可定製性的客戶才需要超越外觀。
- 客戶端和抽象的實現類之間存在許多依賴關係。引入外觀,將子系統與客戶端和其他子系統分離,從而提升子系統的獨立性和可移植性。
- 您希望將子系統分層。使用外觀來定義每個子系統級別的入口點。如果子系統是相互依賴的,那麼您可以通過使它們僅通過它們的外觀相互通訊來簡化它們之間的依賴關係。
相關文章
- 結構模式 01-外觀模式(facade)模式
- JS設計模式之Facade(外觀)模式JS設計模式
- 《設計模式》 - 8. 外觀模式( Facade )設計模式
- C#設計模式-外觀模式(Facade Pattern)C#設計模式
- 外觀模式(Facade模式)詳解——小馬同學@Tian模式
- 使用C# (.NET Core) 實現介面卡模式 (Adapter Pattern) 和外觀模式 (Facade Pattern)C#模式APT
- 外觀模式模式
- 設計模式系列之外觀模式(Facade Pattern)——提供統一的入口設計模式
- 設計模式-外觀模式設計模式
- 結構型模式:外觀模式模式
- 設計模式(十)外觀模式設計模式
- java設計模式-外觀模式Java設計模式
- Python設計模式-外觀模式Python設計模式
- 【設計模式】外觀設計模式
- python-外觀模式Python模式
- 軟體設計模式————(外觀模式)設計模式
- 《Head First 設計模式》:外觀模式設計模式
- 極簡設計模式-外觀模式設計模式
- 結構性外觀模式.模式
- 設計模式之【門面模式(外觀模式)】設計模式
- 【23種設計模式】外觀模式(十)設計模式
- 設計模式第六講-外觀模式設計模式
- 11.7實驗12:外觀模式模式
- 設計模式 | 外觀模式及典型應用設計模式
- 09.外觀模式設計思想模式
- 軟體設計模式系列之十二——外觀模式設計模式
- Go 實現常用設計模式(八)外觀模式Go設計模式
- java23種設計模式-門面模式(外觀模式)Java設計模式
- 設計模式學習-使用go實現外觀模式設計模式Go
- 設計模式【9】-- 外觀模式?沒那麼高大上設計模式
- Swift 中的設計模式 #3 外觀模式與介面卡模式Swift設計模式
- 2020重新出發,JAVA設計模式 之十 外觀模式Java設計模式
- 外觀模式-簡化子系統的複雜性模式
- 裝飾/原型/外觀設計模式簡單理解原型設計模式
- Java進階篇設計模式之五-----外觀模式和裝飾器模式Java設計模式
- React中 `鎖定`this的N種‘facade pattern’模式React模式
- javascript設計模式(張容銘)學習筆記 – 外觀模式繫結事件JavaScript設計模式筆記事件
- facade 使用