定义: 为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用
![](https://i-blog.csdnimg.cn/blog_migrate/f6881e75c6a9a3f2410096e542b36200.png)
/**
* A模块的接口
*/
public interface AModuleApi {
/**
* 示意方法,A模块对外的一个功能方法
*/
public void testA();
}
public class AModuleImpl implements AModuleApi {
@Override
public void testA() {
System.out.println("现在在A模块中操作testA方法");
}
}
public interface BModuleApi {
public void testB();
}
public class BModuleImpl implements BModuleApi {
@Override
public void testB() {
System.out.println("现在在B模块中操作testB方法");
}
}
public interface CModuleApi {
public void testC();
}
public class CModuleImpl implements CModuleApi {
@Override
public void testC() {
System.out.println("现在在C模块中操作testC方法");
}
}
/**
* 外观对象
*/
public class Facade {
public void test() {
AModuleApi a = new AModuleImpl();
a.testA();
BModuleApi b = new BModuleImpl();
b.testB();
CModuleApi c = new CModuleImpl();
c.testC();
}
}
public class Client {
public static void main(String[] args) {
new Facade().test();
}
}
外观模式不是给子系统添加新的功能接口,而是为了让外部减少与子系统内多个模块的交互,松散耦合,从而让外部能够更简单地使用子系统
外观模式应该是包装已有的功能,主要负责组合已有功能来实现客户需要,而不是添加新的实现。
外观模式的优点:
松散耦合
简单易用
更好地划分访问的层次
外观模式在各种流行框架都非常常用,比如在RocketMQ中,Name Server的关闭就是通过外观模式实现优雅的将所有线程关闭,实现方法是org.apache.rocketmq.namesrv.NamesrvController#shutdown
public void shutdown() {
this.remotingServer.shutdown();
this.remotingExecutor.shutdown();
this.scheduledExecutorService.shutdown();
if (this.fileWatchService != null) {
this.fileWatchService.shutdown();
}
}