外观模式
业务需求:
组建家庭影院,包括DVD播放器,投影仪,自动屏幕,环绕立体声,爆米花机;用遥控器完成各个功能;
- 遥控器
- 开爆米花机
- 放下屏幕
- 开投影仪
- 开音响
- 开DVD
- 拿爆米花
- 调整灯光
- 播放
- 观影结束,关闭设备
传统解决方式
传统解决方式问题分析
- 在ClientTest中,创建各个子系统对象并直接调用相关方法,会造成调用过程混乱,没有清晰的过程
- 不利于在ClientTest中维护子系统的操作
- 解决思路,定义一个高层接口,给子系统中的一组接口提供一个一致的界面,比如高层接口提供ready/play/pause/end,用来访问子系统中的一群接口
- 通过定义一个一致性的接口(界面类),用以屏蔽内部子系统的细节,使得调用端只需跟这个接口发生调用,而无需关心这个子系统内部的细节,外观模式
基本介绍
- 外观模式,也叫过程模式,为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用,
- 外观模式通过定义一个一致的接口,用以屏蔽内部子系统的细节, 使得调用端只需跟这个接口发生调用,而无需关系这个子系统的内部细节
原理图说明
- 外观类Facade,为调用端提供统一的调用接口,外观类知道哪些子系统负责处理请求,从而将调用端的请求代理给适当的子系统对象
- 调用者Client,外观接口调用者
- 子系统的集合,指模块或者子系统,处理Facade对象指派的任务,是功能的提供者
- 外观模式就是解决多个复杂接口带来的使用困难,起到简化用户操作的作用
代码实现
各个设备功能
public class DVDPlayer {
// 单例模式 饿汉式
private static DVDPlayer instance = new DVDPlayer();
public static DVDPlayer getInstance() {
return instance;
}
public void on() {
System.out.println("DVD 打开");
}
public void off() {
System.out.println("DVD 关闭");
}
public void play() {
System.out.println("DVD 播放");
}
public void pause() {
System.out.println("DVD 暂停");
}
}
public class Popcorn {
private static Popcorn instance = new Popcorn();
public static Popcorn getInstance() {
return instance;
}
public void on() {
System.out.println("爆米花机 打开");
}
public void off() {
System.out.println("爆米花机 关闭");
}
pub