
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