Java设计模式(二十一)—— 外观模式

        外观模式是指为系统中的一组接口提供一个一致的界面,通过定义一个高层接口,使得这一子系统更加容易使用。外观模式隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口。这种类型的设计模式属于结构性设计模式。为子系统中的一组接口提供了一个统一的访问接口,这个接口使得子系统更容易被访问或者使用。

适合外观模式的情景如下:

  • 对于一个复杂的子系统,提供一个简单的交互操作
  • 不希望客户代码和子类中的类耦合

示例:

冰箱由冷冻室和冷藏室构成,其中,冷冻室和冷藏室都有初始化、运行、关机三个主要过程。

public class Container {
    public void init(){
        System.out.println("container init");
    }
    public void run() {
        System.out.println("container run");
    }
    public void shutdown() {
        System.out.println("container shutdown");
    }
}
class Freezer{
    public void init(){
        System.out.println("Freezer init");
    }
    public void run() {
        System.out.println("Freezer run");
    }
    public void shutdown() {
        System.out.println("Freezer shutdown");
    }
}

如果要实现冰箱运行仿真全过程功能,可能会有人这样写:

public class Test {
    public static void main(String[] args) {
        Container c = new Container();
        Freezer f = new Freezer();
        c.init();
        f.init();
        c.run();
        f.run();
        c.shutdown();
        f.shutdown();
    }
}

使用外观模式改进:

只需增加一个冰箱类即可

在该类中:冰箱初始化是由冷藏室、冷冻室两部分功能类组成。冰箱运行、关机也是如此。该类也叫外观类。

public class Refrigerator {
    Container c = new Container();
    Freezer f = new Freezer();
    public void init() {
        c.init();
        f.init();
    }
    public void run() {
        c.run();
        f.run();
    }
    public void shutdown() {
        c.shutdown();
        f.shutdown();
    }
}

测试类:

public class Test1 {
    public static void main(String[] args) {
        Refrigerator r = new Refrigerator();
        r.init();
        r.run();
        r.shutdown();
    }
}

结果:

container init
Freezer init
container run
Freezer run
container shutdown
Freezer shutdown

从测试类可以看出,我们只知道冰箱初始化,但冰箱包含几部分,哪些部分初始化,我们是不知道的,因为它们都由外观类Refrigerator封装了。同理运行、关机也如此。

外观模式各个角色描述如下:

  • Facade:门面角色,外观模式的核心。它被客户角色调用,熟悉子系统的功能。内部根据客户角色的需求预定了几种功能的组合,本例中的 Refrigerator
  • Subsystem:子系统角色,实现了子系统的功能。它对客户角色和Facade是未知的。它内部可以由系统内的相互交互,也可以供外界调用的接口。本例中的 冷藏室冷冻室
  • Client:客户角色,通过调用Facede来完成要实现的功能。

外观模式在springboot中的应用:

在Spring Boot中,外观模式(Facade Pattern)通常用于简化与框架或库的交互。

一个典型的例子是Spring Boot的WebMvcConfigurer接口。在使用Spring MVC时,通常需要许多配置和自定义选项,例如添加自定义拦截器、消息转换器、异常处理器等。但是,将这些选项直接添加到WebMvcConfigurer接口中可能会导致代码混乱和难以维护。

因此,Spring Boot使用外观模式,提供了一个WebMvcConfigurerAdapter类,该类允许开发人员通过覆盖一些简单方法来完成配置,而不必直接修改复杂的WebMvcConfigurer接口。

另一个例子是Spring Boot的JdbcTemplate类,该类是用于与数据库交互的简单模板类。JdbcTemplate隐藏了所有与JDBC API相关的细节,并提供了简单的方法来执行SQL查询和更新。通过这种方式,JdbcTemplate充当了一个外观,简化了与数据库的交互。

因此,在Spring Boot中,外观模式被广泛应用于简化与框架和库的交互。

 

你可能感兴趣的:(设计模式,设计模式,java,外观模式)