外观模式
定义
为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层的接口,使得子系统更加容易实现
说明:“接口”为泛指模块对外开放的类
结构
**Facade:**定义子系统多个模块对外的高处接口,通常需要调用内部多个模块,从而把客户的代理请求给适当的子系统对象
**模块:**接受facade对象的委派,真正实现功能,各个模块之间可能有交互。
Facade对象知道各个模块,但各个模块不应该知道Facade对象。
代码
public interface AModel {
public void testA();
}
public interface BModel {
public void testB();
}
public interface CModel {
public void testC();
}
public class AModelImpl implements AModel{
@Override
public void testA() {
System.out.println("A模块测试testA方法");
}
}
public class BModelImpl implements BModel{
@Override
public void testB() {
System.out.println("B模块测试testB方法");
}
}
public class CModelImpl implements CModel{
@Override
public void testC() {
System.out.println("C模块测试testC方法");
}
}
public class Facade {
public void test(){
AModel aModel = new AModelImpl();
BModel bModel = new BModelImpl();
CModel cModel = new CModelImpl();
aModel.testA();
bModel.testB();
cModel.testC();
}
}
public class Client {
public static void main(String[] args) {
new Facade().test();
}
}
目的
- 让外部减少与子系统内多个模块的交互,松散耦合,从而让外部能够更简单的使用子系统。
- 不改变原先功能,Facade方便客户端的调用、封装内部细节、实现功能的共享和复用。
- 有外观可以不使用。
- 外观提供了缺省的功能实现
实现
- 把外观类当成一个辅助工具类实现
- Facade可以实现成为接口
- 有选择性的暴露接口方法,尽量减少模块对子系统外提供的接口方法
Facade的方法只是实现一个功能的组合调用
优缺点
- 松散耦合
- 简单易用
- 更好的划分访问层次(选择性暴露接口方法)
- 过多的或者不太合理的Facade也容易让人迷惑
本质
- 封装交互、简化调用
- 体现了“最少知识原则”
何时选用外观模式
- 希望复杂(指与客户端交互复杂)的子系统提供一个简单接口时,使用简化客户的使用。
- 让客户程序和抽象类的实现部分实现松散耦合,提高子系统的独立性和移植性。
- 构建多层结构系统,简化层间关系,松散层次之间的依赖关系。