简介
外观模式比较简单,定义为:为子系统的一组接口提供一个统一的入口,外观模式定义一个高层的接口,这个接口使得子系统更加统一使用。
其实很好理解,就是当我们的业务过于复杂,调用过于繁琐时,使用一个接口来面向客户屏蔽具体实现细节,而是在接口内部实现具体的业务调用。降低客户与子系统的耦合程度。
案例
以看电影为例,假如我在家中想要观看电影,同时希望有良好的观影体验,那么我可能需要进行以下几步(做了简化,实际上可能不止这几步):
- 拉上窗帘
- 关闭灯光
- 开启投影
但是这样子太麻烦了,假如我接入了智能家居,我设计一个逻辑,通过按一个按钮就能自动的执行上述三个步骤,那么我就会感觉轻松很多。
按钮就是外观模式的接口,这个逻辑就是接口的内部实现。
具体实现
//灯
public class Lamp {
//打开
public void on(){
System.out.println("打开灯");
}
//关闭
public void off(){
System.out.println("关闭灯");
}
}
//窗帘
public class Curtain {
//打开
public void on(){
System.out.println("打开窗帘");
}
//关闭
public void off(){
System.out.println("关闭窗帘");
}
}
//投影仪
public class Projector {
//打开
public void on(){
System.out.println("打开投影仪");
}
//关闭
public void off(){
System.out.println("关闭投影仪");
}
}
@Data
//看电影接口
public class MovieMode {
private Lamp lamp;
private Curtain curtain;
private Projector projector;
public MovieMode(Lamp lamp, Curtain curtain, Projector projector) {
this.lamp = lamp;
this.curtain = curtain;
this.projector = projector;
}
public void watchMovie()
{
lamp.off();
curtain.off();
projector.on();
}
public void stopMovie()
{
lamp.on();
curtain.on();
projector.off();
}
}
测试
@Test
public void Test()
{
//将设备都接入接口
Lamp lamp=new Lamp();
Curtain curtain=new Curtain();
Projector projector=new Projector();
MovieMode movieMode=new MovieMode(lamp,curtain,projector);
System.out.println("开始看电影");
movieMode.watchMovie();
System.out.println("看电影ing");
movieMode.stopMovie();
System.out.println("结束看电影");
}
开始看电影
关闭灯
关闭窗帘
打开投影仪
看电影ing
打开灯
打开窗帘
关闭投影仪
结束看电影
总结
这个模式很好理解,实际中可能也经常无意识的用到了,将复杂操作封装成简易接口供客户端调用,从而降低客户端的操作难度以及与客户端解耦合。