設計模式-門面模式
定義
門面模式(Facade Pattern)也叫外觀模式,它隱藏系統的復雜性,並向客戶端提供一個可以訪問系統的接口。這種類型的設計模式屬於結構型模式,它向現有的系統添加一個接口,來隱藏系統的復雜性,為子系統中的一組接口提供了一個統一的高層訪問接口,這個接口使得子系統更容易被訪問或使用。
基本簡介
(1)客戶端
通過調用Facede來完成要實現的功能。
(2)門面角色
門面模式的核心。它被客戶角色調用,它熟悉子系統的功能。內部根據客戶角色的需求預定了幾種功能的組合。
(3)子系統
實現了子系統的功能。它對客戶角色和Facade時未知的。它內部可以有系統內的相互交互,也可以由供外界調用的接口。
示例
我們拿生活中電腦開機為例
結構
(1.1)子系統
public class Cpu { private Logger logger = Logger.getLogger(Cpu.class.getName()); /** * 釋放 */ public void freeze() { logger.info("cpu freeze.."); } /** * 執行*/ public void execute() { logger.info("cpu execute.."); } }
public class HardDrive { private Logger logger = Logger.getLogger(HardDrive.class.getName()); public void read() { logger.info("hardDrive read.."); } }
public class Memory { private Logger logger = Logger.getLogger(Memory.class.getName()); public void load() { logger.info("memory load.."); } }
(1.2)門面
public class Computer { private Cpu cpu; private Memory memory; private HardDrive hardDrive; public Computer() { cpu = new Cpu(); memory = new Memory(); hardDrive = new HardDrive(); } public void start() { cpu.freeze(); hardDrive.read(); memory.load(); cpu.execute(); } }
(1.3)客戶端
這裏我們用單元測試入口作為調用端
public class facadeClient { @Test public void testFacadeDesign() { Computer facade = new Computer(); facade.start(); } }
(1.4)客戶端調用結果
門面模式在Tomcat中的使用
如下是查看tomcat源碼中的類引用關系得到的結果
Request對象中的很多方法都是內部組件之間相互交互時使用的,比如setComet、setRequestedSessionId等方法(這裏就不一一列舉了)。這些方法並不對外部公開,但是又必須設置為public,因為還需要跟內部組件之間交互使用。最好的解決方法就是通過使用一個Facade類,將與內部組件之間交互使用的方法屏蔽掉,只提供給外部程序感興趣的方法。
如果不使用Facade類,直接傳遞的是Request對象和Response對象,那麽熟悉容器內部運作的程序員可以分別把ServletRequest和ServletResponse對象向下轉換為Request和Response,並調用它們的公共方法。比如擁有Request對象,就可以調用setComet、setRequestedSessionId等方法,這會危害安全性。
小結
門面模式的用意是為子系統提供一個集中化和簡化的溝通管道,而不能向子系統加入新的行為。門面模式的優點:
1.松散耦合
門面模式松散了客戶端與子系統的耦合關系,讓子系統內部的模塊能更容易擴展和維護。
2.簡單易用
門面模式讓子系統更加易用,客戶端不再需要了解子系統內部的實現,也不需要跟眾多子系統內部的模塊進行交互,只需要跟門面類交互就可以了。
3.更好的劃分訪問層次
通過合理使用Facade,可以幫助我們更好地劃分訪問的層次。有些方法是對系統外的,有些方法是系統內部使用的。把需要暴露給外部的功能集中到門面中,這樣既方便客戶端使用,也很好地隱藏了內部的細節。
設計模式-門面模式