1、定义
提供一个统一的接口,用来访问子系统的一群接口,外观模式定义了一个高层接口,让子系统更容易使用。
2、关键点
① 当需要简化并统一一个很大的接口或者一群复杂的接口时,使用外观模式。
② 外观模式将客户端从一个复杂的子系统中接口。
③ 实现外观模式,需要将子系统组合进外观中,然后将具体操作委托给子系统。
3、UML类图
![](https://i-blog.csdnimg.cn/blog_migrate/f83505200b93b9f09212a48440834fe5.jpeg)
4、代码实现
/**
* 通话子系统
*/
public class CallSystem {
public void call(){
System.out.println("CallSystem:call");
}
public void hangUp(){
System.out.println("CallSystem:hang up");
}
}
/**
* 摄像头子系统
*/
public class CameraSystem {
public void takePicture() {
System.out.println("CameraSystem:take picture");
}
public void closeCamera() {
System.out.println("CameraSystem:close camera");
}
}
/**
* 外观模式高层接口
*/
public class MobilePhone {
private CallSystem caller = new CallSystem();
private CameraSystem camera = new CameraSystem();
public void call() {
caller.call();
}
public void hangUp(){
caller.hangUp();
}
public void takePicture(){
camera.takePicture();
}
public void closeCamera(){
camera.closeCamera();
}
}
5、总结
优点:① 隐藏子系统接口,对外提供一个统一的高层接口,减少客户端与子系统之间的耦合,更加便于使用。
缺点:① 外观接口接口膨胀,外观对象包含了过多的子系统接口,一定程度上增加了使用成本。
② 没有遵循开闭原则,当业务出现变更时,可能需要修改外观类。
代码:https://gitee.com/os2chen/DesignPattern
参考:《Head First Design》、《Android源码设计模式解析与实战》