1. 程式人生 > >設計模式-門面模式

設計模式-門面模式

sta 電腦 tro 擁有 示例 程序員 drive 高層 公開

定義

門面模式(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,可以幫助我們更好地劃分訪問的層次。有些方法是對系統外的,有些方法是系統內部使用的。把需要暴露給外部的功能集中到門面中,這樣既方便客戶端使用,也很好地隱藏了內部的細節。

設計模式-門面模式