每日一發(fā)設計模式 - 門面模式(Facade)

facade

什么是Facade模式

外部和一個系統(tǒng)通信必須通過一個統(tǒng)一的門面(facade)對象進行
facade模式的本質:封裝交互,簡化調用
很好的提現了最小知識原則

場景

外部系統(tǒng)P要與系統(tǒng)Q的多個模塊進行通信,分別是A模塊、B模塊、C模塊等等。這時候對于系統(tǒng)P來說就很麻煩,因為他要熟知系統(tǒng)Q下到底有多少模塊以及每個模塊具體是干嘛的,復雜度很高。
解決這種不便的方式是在系統(tǒng)Q種引入一個facade對象,主要用于轉發(fā)。
那么,對于所有外部系統(tǒng)來說,只需要與facade對象交互月底即可,極大的降低了復雜度。

結構

facade

例子

新增幾個模塊對象

package com.mk.designDemo.designs.facade.module;

public class ModuleA {

    public static void methodA() {
        System.out.println("invoke method A");
    }
}

package com.mk.designDemo.designs.facade.module;

public class ModuleB {

    public static void methodB() {
        System.out.println("invoke method B");
    }
}

package com.mk.designDemo.designs.facade.module;

public class ModuleC {
    public static void methodC() {
        System.out.println("invoke method C");
    }
}

新增一個config對象

package com.mk.designDemo.designs.facade;

import lombok.Data;
import lombok.experimental.Builder;

@Data
@Builder
public class FacadeConfig {
    private boolean config1;
    private boolean config2;
    private boolean config3;
}

新增一個Facade對象

package com.mk.designDemo.designs.facade;

import com.mk.designDemo.designs.facade.module.ModuleA;
import com.mk.designDemo.designs.facade.module.ModuleB;
import com.mk.designDemo.designs.facade.module.ModuleC;

public class SystemFacade {

    private SystemFacade(){}

    public static void doSomething(FacadeConfig config) {
        if(config.isConfig1()){
            ModuleA.methodA();
        }
        if(config.isConfig2()){
            ModuleB.methodB();
        }
        if(config.isConfig3()){
            ModuleC.methodC();
        }
    }
}

新增測試類

package com.mk.designDemo.facade;

import com.mk.designDemo.designs.facade.FacadeConfig;
import com.mk.designDemo.designs.facade.SystemFacade;
import com.mk.designDemo.designs.facade.module.ModuleA;
import com.mk.designDemo.designs.facade.module.ModuleB;
import com.mk.designDemo.designs.facade.module.ModuleC;
import org.junit.Test;

public class FacadeTest {

    @Test
    public void beforeFacade(){
        // 外部系統(tǒng)P需要與A、B、C三個模塊交互
        ModuleA.methodA();
        ModuleB.methodB();
        ModuleC.methodC();

        // 外部系統(tǒng)M需要與A、B三個模塊交互
        ModuleA.methodA();
        ModuleB.methodB();

        // 外部系統(tǒng)M需要與B、C三個模塊交互
        ModuleB.methodB();
        ModuleC.methodC();
    }

    @Test
    public void afterFacade(){
        // 外部系統(tǒng)P需要與A、B、C三個模塊交互
        SystemFacade.doSomething(FacadeConfig.builder().config1(true).config2(true).config3(true).build());
        // 外部系統(tǒng)M需要與A、B三個模塊交互
        SystemFacade.doSomething(FacadeConfig.builder().config1(true).config2(true).build());
        // 外部系統(tǒng)M需要與B、C三個模塊交互
        SystemFacade.doSomething(FacadeConfig.builder().config2(true).config3(true).build());
    }
}

經過測試,我們發(fā)現運行結果完全一致。但是對于外部系統(tǒng)來說,很大程度上降低了他們的學習成本,他們只需要知道有facade的接口,其他的不需要知道。對于內部系統(tǒng)來說,隱藏了內部的模塊細節(jié),松散耦合。

image.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容