设计模式学习专栏七--------外观模式
场景
在我们进入外观模式之前 , 让我们看一个风行全美的热潮: 建立自己的家庭影院
经过一番研究比较,你组装了一套杀手级别的系统 , 内含DVD播放器, 投影机, 自动屏幕, 环绕立体声 ,甚至还有爆米花机.
以下是相关的组件
正当一切部署完成,想要开始享受一部电影时,却发现...
使用代码实现看电影
出现的问题
我们的客户端需要面对太多具体的组件了 ! 导致操作家庭影院很麻烦
如何解决
使用外观模式, 通过实现一个提供更合理的接口的外观类 , 让我们可以将一个复杂的子系统变得更容易使用
外观模式总览
定义:提供了一个统一的接口,用于访问子系统中的一群接口. 外观定义了一个高层接口,让子系统更容易使用
-
模式的理解
-
类图
-
角色
- 客户 : 客户只有一个朋友,也就是外观 , 避免了和系统中太多的类耦合到了一起
- 外观类 : 外观类帮助客户管理全部子系统组件,它的存在让客户变得简单又有弹性
- 子系统中的类
-
-
外观模式与适配器模式的区别
- 适配器的意图是要
转换
被适配接口 成客户期望的另一个接口
而外观的意图是要统一和简化接口
- 适配器的意图是要
核心代码部分
主程序
public class HomeTheaterTestDrive {
public static void main(String[] args) {
Amplifier amp = new Amplifier("Top-O-Line Amplifier");
Tuner tuner = new Tuner("Top-O-Line AM/FM Tuner", amp);
DvdPlayer dvd = new DvdPlayer("Top-O-Line DVD Player", amp);
CdPlayer cd = new CdPlayer("Top-O-Line CD Player", amp);
Projector projector = new Projector("Top-O-Line Projector", dvd);
TheaterLights lights = new TheaterLights("Theater Ceiling Lights");
Screen screen = new Screen("Theater Screen");
PopcornPopper popper = new PopcornPopper("Popcorn Popper");
HomeTheaterFacade homeTheater =
new HomeTheaterFacade(amp, tuner, dvd, cd,
projector, screen, lights, popper);
//客户只与外观直接交互
homeTheater.watchMovie("Raiders of the Lost Ark");
homeTheater.endMovie();
}
}
外观
public class HomeTheaterFacade {
Amplifier amp; //子系统中的各个组件
Tuner tuner;
DvdPlayer dvd;
CdPlayer cd;
Projector projector;
TheaterLights lights;
Screen screen;
PopcornPopper popper;
public HomeTheaterFacade(Amplifier amp,
Tuner tuner,
DvdPlayer dvd,
CdPlayer cd,
Projector projector,
Screen screen,
TheaterLights lights,
PopcornPopper popper) {
this.amp = amp;
this.tuner = tuner;
this.dvd = dvd;
this.cd = cd;
this.projector = projector;
this.screen = screen;
this.lights = lights;
this.popper = popper;
}
public void watchMovie(String movie) {
System.out.println("Get ready to watch a movie...");
popper.on();
popper.pop();
lights.dim(10);
screen.down();
projector.on();
projector.wideScreenMode();
amp.on();
amp.setDvd(dvd);
amp.setSurroundSound();
amp.setVolume(5);
dvd.on();
dvd.play(movie);
}
}
-
输出结果
Get ready to watch a movie... Popcorn Popper on Popcorn Popper popping popcorn! Theater Ceiling Lights dimming to 10% Theater Screen going down Top-O-Line Projector on Top-O-Line Projector in widescreen mode (16x9 aspect ratio) Top-O-Line Amplifier on Top-O-Line Amplifier setting DVD player to Top-O-Line DVD Player Top-O-Line Amplifier surround sound on (5 speakers, 1 subwoofer) Top-O-Line Amplifier setting volume to 5 Top-O-Line DVD Player on Top-O-Line DVD Player playing "Raiders of the Lost Ark"
参考
书籍: HeadFirst设计模式
代码参考地址: 我就是那个地址