一、概念
外观模式(Facade Pattern):隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。
优点:外观模式是迪米特法则的践行者,遵循着让客户端知道最少的原则,实现客户端和子系统类的解耦。
缺点:外观模式不符合“开闭模式”,当子系统类增加或者减少的时候,都需要修改外观类中的方法。引入抽象外观类在一定程度上解决了这个问题,但是维护抽象外观类及其子类也需要一定的成本。
使用场景:为子系统的一组接口提供一个简单的接口,最小化对子系统的依赖性。
二、实现
现在年轻人比较喜欢智能家居,很多家电都可以用手机智能控制,比如:家里的灯可以语音或者手机软件上进行开关,智能窗帘、电视等都可以通过手机一键开启关闭。但是每次操作都需要一个一个进行,回家后对这些家电的操作方式基本一致,因此,我们定义一个“回家模式”外观类。每次只要点击回家模式可以将家电操作一并进行。
1、家电类
#Light
public class Light {
public void turnOn() {
System.out.println("开灯");
}
public void turnOff() {
System.out.println("关灯");
}
}
#Curtain
public class Curtain {
public void open() {
System.out.println("打开窗帘");
}
public void close() {
System.out.println("关上窗帘");
}
}
#TV
public class TV{
public void turnOn() {
System.out.println("电视开机");
}
public void turnOff() {
System.out.println("电视关机");
}
}
2、外观模式 - 定义个“回家模式”,回家以后把灯打开,窗帘关上,电视打开。
public class BackHomeMode {
private Curtain curtain;
private Light light;
private TV tv;
public BackHomeMode() {
curtain = new Curtain();
light = new Light();
tv = new TV();
}
public void startHomeMode() {
light.turnOn();
curtain.close();
tv.turnOn();
}
}
3、测试类
public class Client {
public static void main(String[] args) {
BackHomeMode backHomeMode = new BackHomeMode();
backHomeMode.startHomeMode();
}
}
4、运行结果