定义
要求一个子系统的外部与内部的通信必需通过一个统一的对象执行,该模式提供一个高层的接口,使得子系统容易复用
演化
在我们的开发生涯中,免不了使用各种各样的第三方库。如Gson,EasyPermissions,Retrofit2,EventBus等。我们会发现它们都有一个共同的特点:尽管源码的内容很多,Java类的文件也有许多。但在我使用的时候会发现往往只需要调用某一个类的方法就能使用这个系统中的所有功能了。其实这就是外观模式的一种实现,这个管理着所有功能的类就是外观类。
示例
1.我们提供一个图形库,让调用者能够通过它画出各种各样的图形。
// 1.定义绘制功能接口
public interface Shape {
void draw();
}
// 2.定义各个实体类
public class Square implements Shape {
@Override
public void draw() {
// 画正方形
}
}
public class Rectangle implements Shape {
@Override
public void draw() {
// 画三角形
}
}
public class Circle implements Shape {
@Override
public void draw() {
// 画圆形
}
}
到此结束,我们会发现以下问题
- 给调用者提供说明文档的时候,需要讲清楚每一个图形类的含义,并提供相应的使用示例
- 调用者需要写不少代码来绘图
2.现在我们给它加一个外观类
public class ShapeUtil {
public static void drawSquare() {
Shape square = new Square();
square.draw();
}
public static void drawRectangle() {
Shape rectangle = new Rectangle();
rectangle.draw();
}
public static void drawCircle() {
Shape circle = new Circle();
circle.draw();
}
}
这时调用者只需要关注ShapeUtil类就好了。说明文档里只需要说明ShapeUtil中的几个方法的功能,调用者调用的时候也只需要一行代码。
优点
(1)减少系统的相互依赖,所有的对子系统的依赖其实都只是对外观类的依赖。
(2)子系统改变之后,外界感知不到,自然也不用修改代码
(3)增强子系统的安全性
(4)整个系统只暴露一个外观类出来,所有使用该系统功能的代码都是通过外观类实现,简洁清晰
缺点
(1)如果系统十分庞大,外观类需要集成的功能将会非常多。