外观模式(Facade)
- 定义:为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用
public interface AModuleApi {
public void testA();
}
public class AModuleImpl implements AModuleApi {
public void testA() {
System.out.println("现在在A模块中操作testA方法");
}
}
public interface BModuleApi {
public void testB();
}
public class BModuleImpl implements BModuleApi {
public void testB() {
System.out.println("现在在B模块中操作testB方法");
}
}
public interface Facade {
public void test();
public void a();
public void b();
}
public class FacadeApi implements Facade {
public void test() {
AModuleApi a = new AModuleImpl();
a.testA();
BModuleApi b = new BModuleImpl();
B.testB();
}
public void a() {
AModuleApi a = new AModuleImpl();
a.testA();
}
public void b() {
BModuleApi b = new BModuleImpl();
B.testB();
}
}
public class Client {
public static void main(String[] args) {
new FacadeApi().test();
}
}
- 外观模式的目的:
- 让外部减少与子系统内多个模块的交互,松散耦合,从而让外部能够更简单地使用子系统
- 屏蔽外部客户端和系统内部模块的交互,从而把AB模块组合成一个整体对外,方便客户端调用,封装了系统内部的细节功能
- 外观模式的方法实现中,一般是负责把客户端的请求转发给子系统内部的各个模块进行处理,Facade的方法本身不进行功能的处理,Facade方法实现只是实现一个功能的组合调用
- 优点
- 缺点
- 过多的或者是不合理的Facade也容易让人迷惑。到底是调用Facade好呢还是直接调用模块好
- 外观模式的本质:封装交互,简化调用
- 何时选用外观模式
- 希望为一个复杂子系统提供简单的接口时
- 想要让客户程序和抽象类的实现部分松散耦合
- 构建多层结构的系统