设计模式之外观模式(结构型)

1、外观模式定义

外观模式(Facade)为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使系统更加容易使用

当一个系统随着时间的流逝,子系统越来越多,功能越来越复杂,如果系统内某个接口改变,客户端也要跟着改变,违背了开闭原则,也违背了 迪米特法则,所以有必要为多个子系统提供一个统一的接口,从而降低系统的耦合度,这就是外观模式的目标。

2、外观模式结构

在这里插入图片描述

三个子系统的类:

import org.springframework.stereotype.Service;

/**
 * 子系统类一
 */
@Service
public class SubSystemOne {

    public void methodOne() {
        System.out.println("子系统方法一");
    }

}

/**
 * 子系统类二
 */
@Service
public class SubSystemTwo {

    public void methodTwo() {
        System.out.println("子系统方法二");
    }

}

/**
 * 子系统类三
 */
@Service
public class SubSystemThree {

    public void methodThree() {
        System.out.println("子系统方法三");
    }

}

外观类:Facade,对子系统的方法或者属性进行组合,供外界调用

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * 外观类,对子系统的方法或者属性进行组合
 */
@Component
public class Facade {

    @Autowired
    private SubSystemOne subSystemOne;

    @Autowired
    private SubSystemTwo subSystemTwo;

    @Autowired
    private SubSystemThree subSystemThree;

    /**
     * 组合方法 A
     */
    public void methodA() {
        System.out.println("方法组合A------");
        subSystemOne.methodOne();
        subSystemTwo.methodTwo();
        subSystemThree.methodThree();
    }

    /**
     * 组合方法 B
     */
    public void methodB() {
        System.out.println("方法组合B------");
        subSystemTwo.methodTwo();
        subSystemThree.methodThree();
    }

}

调用方代码

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.TestPropertySource;

@TestPropertySource("classpath:test.properties")
@SpringBootTest(classes = Application.class)
public class FacadeTest extends BaseTest {

    @Autowired
    private Facade facade;

    @Test
    public void test() {
        facade.methodA();
        facade.methodB();
    }

}

// 方法组合A------
// 子系统方法一
// 子系统方法二
// 子系统方法三
// 方法组合B------
// 子系统方法二
// 子系统方法三

3、外观模式应用场景

  • 在设计初期阶段,应该要有意识的将不同的层分离,比如经典的三层架构,就需要我们在数据访问层、业务逻辑层、表示层之间建立外观 Facade,这样可以为复杂的子系统提供一个简单的接口,降低耦合
  • 在开发中,系统功能增加,系统会越来越复杂,增加外观 Facade 可以减少类之间的依赖
  • 在后期对系统的维护中,可以开发一个新的 Facade 类,来提供设计粗糙或者复杂遗留代码的比较清晰简单的接口,让新的系统与 Facade 对象交互

版权声明:本文为qq_53316135原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。