- 外观模式
外观模式又称门面模式,提供了一个统一的接口,用来访问子系统中的一群接口。
特征
门面模式定义了一个高层接口,让子系统更容易使用。
外观(Facade)模式包含以下主要角色:
- 外观(Facade)角色:为多个子系统对外提供一个共同的接口。
- 子系统(Sub System)角色:实现系统的部分功能,客户可以通过外观角色访问它。
1.1 代码实现
下面以一个智能音箱实现起床睡觉一键操作电器的场景,通过代码模拟一下这个场景:
public class Light {
public void on() {
System.out.println("开灯");
}
public void off() {
System.out.println("关灯");
}
}
public class Tv {
public void on() {
System.out.println("开电视");
}
public void off() {
System.out.println("关电视");
}
}
public class Fan {
public void on() {
System.out.println("开风扇");
}
public void off() {
System.out.println("关风扇");
}
}
public class SmartSpeaker {
private Light light;
private Tv tv;
private Fan fan;
public SmartSpeaker() {
light = new Light();
tv = new Tv();
fan = new Fan();
}
public void say(String order) {
if (order.contains("起床")) {
getUp();
} else if (order.contains("睡觉")) {
sleep();
} else {
System.out.println("我还听不懂你说的啥!");
}
}
public void getUp() {
System.out.println("起床");
light.on();
tv.on();
fan.off();
}
public void sleep() {
System.out.println("睡觉");
light.off();
tv.off();
fan.on();
}
}
public static void main(String[] args) {
SmartSpeaker smartSpeaker = new SmartSpeaker();
//睡觉
//关灯
//关电视
//开风扇
smartSpeaker.say("我要睡觉了!");
//起床
//开灯
//开电视
//关风扇
smartSpeaker.say("我起床了!");
//我还听不懂你说的啥!
smartSpeaker.say("Emmm");
}
1.2 总结
适用场景:
- 对分层结构系统构建时,使用外观模式定义子系统中每层的入口点可以简化子系统之间的依赖关系。
- 当一个复杂系统的子系统很多时,外观模式可以为系统设计一个简单的接口供外界访问。
- 当客户端与多个子系统之间存在很大的联系时,引入外观模式可将它们分离,从而提高子系统的独立性和可移植性。
优点:
- 简化了调用过程,无需深入了解子系统,以防给子系统带来风险。
- 减少系统依赖、松散耦合。
- 更好地划分访问层次,提高了安全性。
- 遵循迪米特法则,即最少知道原则。
缺点:
- 当增加子系统和扩展子系统行为时,可能容易带来未知风险。
- 不符合开闭原则。
- 某些情况下可能违背单一职责原则。