描述
- 隐藏复杂的,难以理解的多个具体内部实现,提供一个一致的,容易理解的外部接口规范。
简易理解
- 就是把一系列复杂的需相互配合的模块封装保护,对外保留一个简易的外观规范。
- 比如:要操作电灯,电视。需要分步分别操作。
- 可以定义一个小爱音箱(外观),不需要知道电灯,电视怎么操作了。只需要操作小爱音箱就可以了。
具体实现
public class Test {
public static void main(String[] args) {
XiaoaiSpeaker xiaoaiSpeaker = new XiaoaiSpeaker();
xiaoaiSpeaker.say("打开所有设备");
xiaoaiSpeaker.say("关闭所有设备");
}
}
class ElectricLight {
void open() {
System.out.println("打开电灯");
}
void close() {
System.out.println("关闭电灯");
}
}
class Television {
void open() {
System.out.println("打开电视");
}
void close() {
System.out.println("关闭电视");
}
}
class XiaoaiSpeaker {
private ElectricLight electricLight;
private Television television;
XiaoaiSpeaker() {
electricLight = new ElectricLight();
television = new Television();
}
void say(String word) {
if (word.contains("打开")) {
electricLight.open();
television.open();
} else if (word.contains("关闭")) {
electricLight.close();
television.close();
} else {
System.out.println("听不懂");
}
}
}
优点
- 降低具体实现和客户端之间的耦合。
- 客户只需要理解外部接口,无需关注具体实现,降低使用成本。
- 符合迪米特法则。
缺点
使用场景
- 子模块较为复杂时,可以定义一个外观层,供客户端使用。
- 多层调用时,可为每一层定义外观层,去使用外观层,这样更改或切换具体实现,使用处不需要更改。
- 客户端与多个系统之间存在联系,可使用外观层管理关系(网关)。