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中,外观模式被广泛应用于简化与框架和库的交互。