引言
外观模式(Facade Pattern),又叫“过程模式”。外观模式为子系统中的一组接口提供一个一致的入口,此模式定义了一个高层接口,这个接口使得这一组子系统更加易用。
一、案例分析
生活中有很多类似的案例,比如驾驶员驾驶汽车,只需要操作方向盘、档杆、离合器、刹车、油门这几个主要接口,而汽车内部的一组操作则不需要驾驶员考虑,比如驾驶员踩刹车后,车子就会停下来,而系统内部实际上通过“刹车”这一接口,经过一系列的机械传动到达刹车片。
再比如,一套豪华的家庭影院,用户只需要简单点击遥控器上的“开始”按钮,一系列诸如:关闭窗帘、打开投影仪、打开音响、放下屏幕就都可以自动完成。
二、外观模式类图
以家庭影院案例为参考,遥控器或操作界面提供了统一的外观接口,接口组装了一系列子系统运行动作:
三、代码实现
窗帘子系统:
public class Curtain {
public void up() {
System.out.println("窗帘升起...");
}
public void down() {
System.out.println("窗帘降下...");
}
}
音响子系统:
public class Sound {
public void on() {
System.out.println("打开音响...");
}
public void off() {
System.out.println("关闭音响...");
}
}
播放器:
public class Player {
public void play() {
System.out.println("开始播放...");
}
public void pause() {
System.out.println("暂停播放...");
}
public void stop() {
System.out.println("退出播放器...");
}
}
投影仪子系统:
public class Projector {
private Player player;
public void init(Player player) {
this.player = player;
}
public void on() {
System.out.println("打开投影机...");
player.play();
}
public void off() {
player.stop();
System.out.println("关闭投影机...");
}
}
家庭影院外观类:
public class HomeTheatre {
private Curtain curtain;
private Projector projector;
private Player player;
private Sound sound;
public HomeTheatre(Curtain curtain, Projector projector, Player player, Sound sound) {
super();
this.curtain = curtain;
this.projector = projector;
this.player = player;
this.sound = sound;
}
/** 一键启动*/
public void start() {
curtain.down();
projector.init(player);
sound.on();
projector.on();
}
/** 暂停播放*/
public void pause() {
player.pause();
}
/** 退出家庭影院*/
public void exitAll() {
curtain.up();
sound.off();
projector.off();
}
}
Client调用端:
public class Client {
public static void main(String[] args) {
HomeTheatre homeTheatre = new HomeTheatre(new Curtain(), new Projector(), new Player(), new Sound());
System.out.println("-----打开家庭影院------");
homeTheatre.start();
System.out.println("-----暂停播放------");
homeTheatre.pause();
System.out.println("-----退出家庭影院------");
homeTheatre.exitAll();
}
}
执行结果:
-----打开家庭影院------
窗帘降下...
打开音响...
打开投影机...
开始播放...
-----暂停播放------
暂停播放...
-----退出家庭影院------
窗帘升起...
关闭音响...
退出播放器...
关闭投影机...
总结
外观模式就是把一部分基础功能一致的代码抽离到单独的子模块中,然后在外观类中聚合使用;或者在设计之初就将业务流设计为多个子系统组合的流水线式,无论哪种方式,外观模式都会让代码的执行逻辑一目了然。
如果过去只是把一堆业务逻辑全部放到一个类中去写,那这只能算得上是面向过程编程。如果你能够把一些代码提出到多个类中去然后依赖它们的话,就成了高大上的外观模式。
外观模式虽然极容易理解,但是它并不符合开闭原则,也不要盲目使用。
在Spring 容器环境的初始化阶段就用到了外观模式,一步一步地执行各个子系统的初始化工作。