外观模式(Facade Pattern)又叫门面模式,隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。
外观模式注重“统一的对象”,也就是提供一个访问子系统的接口,除了这个接口不允许有任何访问子系统的行为发生。
场景
- 为一个复杂的模块或者子系统提供一个供外界访问的接口
- 子系统相对独立,外界对子系统的访问主要黑箱操作即可
- 定义系统的入口
实现
源码来自于菜鸟教程-设计模式
核心思想
在客户端和复杂系统之间再加一层,这一层处理调用顺序、依赖关系等
抽象组件
Shape.java
public interface Shape {
void draw();
}
创建实体类
Rectangle.java
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Rectangle::draw()");
}
}
Square.java
public class Square implements Shape {
@Override
public void draw() {
System.out.println("Square::draw()");
}
}
Circle.java
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Circle::draw()");
}
}
创建一个外观类
ShapeMaker.java
public class ShapeMaker {
private Shape circle;
private Shape rectangle;
private Shape square;
public ShapeMaker() {
circle = new Circle();
rectangle = new Rectangle();
square = new Square();
}
public void drawCircle(){
circle.draw();
}
public void drawRectangle(){
rectangle.draw();
}
public void drawSquare(){
square.draw();
}
}
更简单的例子
电脑整机是CUP、内存、硬盘的外观。
启动电脑(按一下电源键):启动CPU、启动内存、启动硬盘
关闭电脑(按一下电源键):关闭硬盘、关闭内存、关闭CPU
优点
- 减少系统之间的相互依赖,避免依赖直接到子系统
- 提高灵活性,只要门面对象不变,子系统可以任意变动
- 提高安全性,在门面类对子系统开放部分访问方法
缺点
- 不符合开闭原则,出现问题只能直接修改门面类的代码
Android 中的应用
系统服务管理类,比如:窗口管理服务类,windowManager,InputManager,activityManager,ServiceManager
参考
书籍:《设计模式之禅》、《Android源码设计模式》
技术文章:菜鸟教程-设计模式