一.概念
外观模式外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。每一个子系统只有一个门面类,而且此门面类只有一个实例,也就是说它是一个单例模式。但整个系统可以有多个门面类。
二.设计原则
7.最少知识原则:只和你的密友谈话。
三.举例子
现在有一个家庭影院系统,这个系统有电视机,空调,电灯等组成。每当看电影时,电视机要开启,空调要开启,电灯要关掉。当电影结束的时候,电视机要关掉,空调要关掉,电灯要开启。可想而知,这个系统肯定有这三个子系统电视机、空调和电灯组成。但每次看家庭影院的时候,都要这三个操作。这时候可以使用外观模式。
/**
* 外观模式 提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用
* 应用场景
* 1)为一个复杂子系统提供一个简单接口。
* 2)提高子系统的独立性。
* 3)在层次化结构中,可以使用Facade模式定义系统中每一层的入口。
*/
public class FacadeTest {
public class TV {
public void turnOnTv() {
System.out.println("打开电视!");
}
public void changeChannel() {
System.out.println("打开电影频道!");
}
public void setVoice() {
System.out.println("设置15音调");
}
public void turnOffTv() {
System.out.println("关闭电视!");
}
}
public class Conditioning {
public void turnOnConditioning() {
System.out.println("打开空调!");
}
public void setTemperature() {
System.out.println("设置26度");
}
public void turnOffConditioning() {
System.out.println("关闭空调!");
}
}
public class Light {
public void turnOnLight() {
System.out.println("打开电灯");
}
public void turnOffLight() {
System.out.println("关闭电灯");
}
}
//因为是内部类,所以当内部存在静态变量时,需要改成静态内部类
public static class Film {
private final TV tv;
private final Conditioning conditioning;
private final Light light;
//此处运用了饿汉式的单例模式,因为只要一个外观就可以了。
private Film() {
this.tv = new FacadeTest().new TV();
this.conditioning = new FacadeTest().new Conditioning();
this.light = new FacadeTest().new Light();
}
private static Film instance = new Film();
public static Film getInstance() {
return instance;
}
public void turnOnFilm() {
this.tv.turnOnTv();
this.tv.changeChannel();
this.tv.setVoice();
this.conditioning.turnOnConditioning();
this.conditioning.setTemperature();
this.light.turnOffLight();
System.out.println("电影开始ing。。。。");
}
public void turnOffFilm() {
this.tv.turnOffTv();
this.conditioning.turnOffConditioning();
this.light.turnOnLight();
System.out.println("电影结束了。。。。。");
}
}
public static void main(String[] args) {
Film.getInstance().turnOnFilm();
System.out.println("=============");
System.out.println("正在播放电影。。。。");
System.out.println("=============");
Film.getInstance().turnOffFilm();
}
}
运行结果:
四.总结
外观模式 提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。然后外观类可以使用单例更好的控制外观。
更多参考