1. 程式人生 > >Java設計模式8:外觀模式

Java設計模式8:外觀模式

一、外觀模式的定義:

外觀模式隱藏了系統的複雜性,並向客戶端提供了一個可以訪問系統的介面。這種型別的設計模式屬於結構性模式。為子系統中的一組介面提供了一個統一的訪問介面,這個介面使得子系統更容易被訪問或者使用。 

二、外觀模式的結構:

1、外觀角色:外觀模式的核心。它被客戶角色呼叫,它熟悉子系統的功能。內部根據客戶角色的需求預定了幾種功能的組合。

2、子系統角色:實現了子系統的功能。它對客戶角色和Facade時未知的。它內部可以有系統內的相互互動,也可以由供外界呼叫的介面。

3、通過呼叫Facede來完成要實現的功能。

 

三、外觀模式程式碼示例:

先模擬三個子系統ModuleA、ModuleB、ModuleC:

/**
 * <pre>
 *    @author : orange
 *    @e-mail : [email protected]
 *    @time   : 2018/10/8 11:53
 *    @desc   : 模擬子系統ModuleA
 *    @version: 1.0
 * </pre>
 */
public class ModuleA {

    public void doSomeThingA(){
        System.out.println("執行ModuleA系統中的doSomeThingA方法...");
    }

}
/**
 * <pre>
 *    @author : orange
 *    @e-mail : [email protected]
 *    @time   : 2018/10/8 14:12
 *    @desc   : 模擬子系統ModuleB
 *    @version: 1.0
 * </pre>
 */
public class ModuleB {

    public void doSomeThingB(){
        System.out.println("執行ModuleB中的dodoSomeThingB方法...");
    }
}
/**
 * <pre>
 *    @author : orange
 *    @e-mail : [email protected]
 *    @time   : 2018/10/8 14:13
 *    @desc   : 模擬子系統ModuleC
 *    @version: 1.0
 * </pre>
 */
public class ModuleC {

    public void doSomeThingC(){
        System.out.println("執行ModuleC中的dodoSomeThingC方法...");
    }
}

  再建立一個外觀物件:

/**
 * <pre>
 *    @author : orange
 *    @e-mail : [email protected]
 *    @time   : 2018/10/8 14:15
 *    @desc   : 模擬一個外觀類(核心)
 *    @version: 1.0
 * </pre>
 */
public class Facade {

    private ModuleA moduleA;
    private ModuleB moduleB;
    private ModuleC moduleC;

    public Facade(){
        this.moduleA = new ModuleA();
        this.moduleB = new ModuleB();
        this.moduleC = new ModuleC();
    }

    public void doSomeThing(){
        moduleA.doSomeThingA();
        moduleB.doSomeThingB();
        moduleC.doSomeThingC();
    }

}

客戶端呼叫一下外觀角色:

/**
 * <pre>
 *    @author : orange
 *    @e-mail : [email protected]
 *    @time   : 2018/10/8 14:23
 *    @desc   : 客戶端呼叫
 *    @version: 1.0
 * </pre>
 */
public class Client {
    public static void main(String[] args){
        Facade facade = new Facade();
        facade.doSomeThing();
    }
}

 

這樣,客戶端不需要親自呼叫子系統的A、B、C模組了,也不需要知道內部系統的實現細節,甚至不需要知道模組A、模組B、模組C的存在,只需要和Facade類互動就好了,從而更好地實現了客戶端和子系統中的三個模組的解耦,讓客戶端更容易地使用子系統。

另外,定義一個外觀類還可以有效地遮蔽內部的細節。因為子系統中有一些方法,是模組之間相互互動用的,並不需要外部呼叫。如果直接呼叫子系統的類方法,會出現一些不需要客戶端知道的方法,這樣既暴露了內部細節,又讓客戶端模迷惑。外觀類就不一樣了,可以只給客戶端提供那些子系統給外部使用的方法。

四、外觀模式的優點:

1、鬆散耦合

外觀模式鬆散了客戶端和子系統的耦合關係,讓子系統內部的模組能更容易擴充套件和維護

2、簡單易用

客戶端不需要了解系統內部的實現,也不需要和眾多子系統內部的模組互動,只需要和外觀類互動就可以了

3、更好地劃分層次

通過合理使用Facade,可以幫助我們更好地劃分層次。有些方法是系統對內的,有些方法是對外的,把需要暴露給外部的功能集中到Facade中,這樣既方便客戶端使用,也很好地隱藏了內部的細節