外观模式的定义
为子系统中的一组接口提供一致的界面,Facade模式定义了一个高级接口,使子系统更加易用。
界面:从外部看这个类,这个类的public方法就是这个类的界面。
接口:不等价于interface,而是内部与外部交互的通道,可以是类方法也可以是接口的方法。
外观模式体现了最少知识原则。
外观模式的本质
封装交互,简化调用。
外观模式的目的
减少外部与内部多个模块的交互,松散耦合,使用更简单。
外观模式包装已有功能,不建议添加新功能。
外观模式提供了缺省的实现,有外观模式也可以不用,仍然可以自己组合。
外观模式的优缺点
松散耦合。松散了子系统与客户端的耦合关系,让子模块更容易扩展。
简单易用。客户端不再需要深入了解子系统内部的实现,也不需要与多个模块进行交互,外观提供了一站式服务。
更好的划分访问层次。有些方法是提供给内部的,有些是提供给外部的。把暴露给外部的功能集中到外观中,既方便外部使用,也隐藏了内部实现。
缺点:过多的不合理的Facade也容易让人迷惑,该用Facade还是直接调用模块。
外观模式使用场景
为一个复杂的系统提供一个简单的接口的时候。
构建多层结构的系统的时候。每层通过外观对象作为入口,既可以简化层间调用又可以松散耦合。
示例1
public interface ApiModuleA {
void moduleA();
}
public class ApiModuleAImpl implements ApiModuleA {
@Override
public void moduleA() {
System.out.println("模块A的方法实现");
}
}
public interface ApiModuleB {
void moduleB();
}
public class ApiModuleBImpl implements ApiModuleB {
@Override
public void moduleB() {
System.out.println("模块B的方法实现");
}
}
public interface ApiModuleC {
void moduleC();
}
public class ApiModuleCImpl implements ApiModuleC {
@Override
public void moduleC() {
System.out.println("模块C的方法实现");
}
}
public class Facade {
public void modules() {
ApiModuleA a = new ApiModuleAImpl();
ApiModuleB b = new ApiModuleBImpl();
ApiModuleC c = new ApiModuleCImpl();
a.moduleA();
b.moduleB();
c.moduleC();
}
}
public class TestClient {
public static void main(String[] args) {
Facade facade = new Facade();
facade.modules();
}
}