外观模式(Facade Pattern)又叫门面模式,隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。
外观模式注重“统一的对象”,也就是提供一个访问子系统的接口,除了这个接口不允许有任何访问子系统的行为发生。

场景

  • 为一个复杂的模块或者子系统提供一个供外界访问的接口
  • 子系统相对独立,外界对子系统的访问主要黑箱操作即可
  • 定义系统的入口

实现

源码来自于菜鸟教程-设计模式

核心思想

在客户端和复杂系统之间再加一层,这一层处理调用顺序、依赖关系等

抽象组件

Shape.java

  1. public interface Shape {
  2. void draw();
  3. }

创建实体类

Rectangle.java

  1. public class Rectangle implements Shape {
  2. @Override
  3. public void draw() {
  4. System.out.println("Rectangle::draw()");
  5. }
  6. }

Square.java

  1. public class Square implements Shape {
  2. @Override
  3. public void draw() {
  4. System.out.println("Square::draw()");
  5. }
  6. }

Circle.java

  1. public class Circle implements Shape {
  2. @Override
  3. public void draw() {
  4. System.out.println("Circle::draw()");
  5. }
  6. }

创建一个外观类

ShapeMaker.java

  1. public class ShapeMaker {
  2. private Shape circle;
  3. private Shape rectangle;
  4. private Shape square;
  5. public ShapeMaker() {
  6. circle = new Circle();
  7. rectangle = new Rectangle();
  8. square = new Square();
  9. }
  10. public void drawCircle(){
  11. circle.draw();
  12. }
  13. public void drawRectangle(){
  14. rectangle.draw();
  15. }
  16. public void drawSquare(){
  17. square.draw();
  18. }
  19. }

更简单的例子
  1. 电脑整机是CUP、内存、硬盘的外观。
  2. 启动电脑(按一下电源键):启动CPU、启动内存、启动硬盘
  3. 关闭电脑(按一下电源键):关闭硬盘、关闭内存、关闭CPU

优点

  • 减少系统之间的相互依赖,避免依赖直接到子系统
  • 提高灵活性,只要门面对象不变,子系统可以任意变动
  • 提高安全性,在门面类对子系统开放部分访问方法

缺点

  • 不符合开闭原则,出现问题只能直接修改门面类的代码

Android 中的应用

系统服务管理类,比如:窗口管理服务类,windowManager,InputManager,activityManager,ServiceManager

参考

书籍:《设计模式之禅》、《Android源码设计模式》
技术文章:菜鸟教程-设计模式