外观模式
- 外观模式也叫过程模式,外观模式为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一字系统更加容易使用
- 外观模式通过定义一个一致的接口,用以屏蔽内部子系统的细节,使得调用端只需要跟这个接口发生调用,而无需关心这个子系统的内部细节
外观模式的角色
- 外观类(Facade):为调用者提供统一的调用接口,外观类知道哪些子系统负责处理请求,从而将调用端的请求代理给适当的子系统对象
- 调用者(Client):外观接口的调用者
- 子系统的集合:模块或子系统,处理Facade对象指派的任务,是功能的实际提供者
示例
比如一个影院管理任务,有投影仪、DVD、屏幕等等,这些都分别需要一个遥控器去控制
DVDPlayer 类:
public class DVDPlayer {
//使用单例模式, 使用饿汉式
private static DVDPlayer instance = new DVDPlayer();
public static DVDPlayer getInstanc() {
return instance;
}
public void on() {
System.out.println(" dvd on ");
}
public void off() {
System.out.println(" dvd off ");
}
public void play() {
System.out.println(" dvd is playing ");
}
//....
public void pause() {
System.out.println(" dvd pause ..");
}
}
投影仪Projector类:
public class Projector {
private static Projector instance = new Projector();
public static Projector getInstance() {
return instance;
}
public void on() {
System.out.println(" Projector on ");
}
public void off() {
System.out.println(" Projector ff ");
}
public void focus() {
System.out.println(" Projector is Projector ");
}
//...
}
屏幕Screen类:
public class Screen {
private static Screen instance = new Screen();
public static Screen getInstance() {
return instance;
}
public void up() {
System.out.println(" Screen up ");
}
public void down() {
System.out.println(" Screen down ");
}
}
外观类:
public class HomeTheaterFacade {
//定义各个子系统对象
private DVDPlayer dVDPlayer;
private Projector projector;
private Screen screen;
//构造器
public HomeTheaterFacade() {
this.dVDPlayer = DVDPlayer.getInstanc();
this.projector = Projector.getInstance();
this.screen = Screen.getInstance();
}
//准备开始
public void ready() {
screen.down(); //放下屏幕
projector.on(); //打开投影仪
dVDPlayer.on(); //打开DVD
}
//播放
public void play() {
dVDPlayer.play();
}
//暂停
public void pause() {
dVDPlayer.pause();
}
//结束
public void end() {
screen.up(); //屏幕放上去
projector.off(); //关闭投影仪
dVDPlayer.off(); //关闭DVD
}
}
客户端:
public class Client {
public static void main(String[] args) {
HomeTheaterFacade homeTheaterFacade = new HomeTheaterFacade();
homeTheaterFacade.ready();
homeTheaterFacade.play();
homeTheaterFacade.end();
}
}
可以看到,使用外观模式的方式只给用户提供基本的接口,至于准备阶段具体需要打开那些电子设备,客户端不用去关心。