美文网首页
每日一发设计模式 - 门面模式(Facade)

每日一发设计模式 - 门面模式(Facade)

作者: 茶铺里的水 | 来源:发表于2019-07-12 11:13 被阅读0次
    facade

    什么是Facade模式

    外部和一个系统通信必须通过一个统一的门面(facade)对象进行
    facade模式的本质:封装交互,简化调用
    很好的提现了最小知识原则

    场景

    外部系统P要与系统Q的多个模块进行通信,分别是A模块、B模块、C模块等等。这时候对于系统P来说就很麻烦,因为他要熟知系统Q下到底有多少模块以及每个模块具体是干嘛的,复杂度很高。
    解决这种不便的方式是在系统Q种引入一个facade对象,主要用于转发。
    那么,对于所有外部系统来说,只需要与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(){
            // 外部系统P需要与A、B、C三个模块交互
            ModuleA.methodA();
            ModuleB.methodB();
            ModuleC.methodC();
    
            // 外部系统M需要与A、B三个模块交互
            ModuleA.methodA();
            ModuleB.methodB();
    
            // 外部系统M需要与B、C三个模块交互
            ModuleB.methodB();
            ModuleC.methodC();
        }
    
        @Test
        public void afterFacade(){
            // 外部系统P需要与A、B、C三个模块交互
            SystemFacade.doSomething(FacadeConfig.builder().config1(true).config2(true).config3(true).build());
            // 外部系统M需要与A、B三个模块交互
            SystemFacade.doSomething(FacadeConfig.builder().config1(true).config2(true).build());
            // 外部系统M需要与B、C三个模块交互
            SystemFacade.doSomething(FacadeConfig.builder().config2(true).config3(true).build());
        }
    }
    

    经过测试,我们发现运行结果完全一致。但是对于外部系统来说,很大程度上降低了他们的学习成本,他们只需要知道有facade的接口,其他的不需要知道。对于内部系统来说,隐藏了内部的模块细节,松散耦合。

    image.png

    相关文章

      网友评论

          本文标题:每日一发设计模式 - 门面模式(Facade)

          本文链接:https://www.haomeiwen.com/subject/dhtekctx.html