1.外观模式概念
适配器模式(Adapter Pattern)提供一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。这句话是《Head First Design Patterns》中文版里的,看起来感觉解释得不是很清楚,但是用里面的一个例子解释可能会更容易理解,这个例子是关于某人要组建一个家庭影院,这个家庭影院包含的设备有DVD播放器,投影机,自动屏幕,立体环绕声和爆米花机。那么当他要享受一下这个家庭影院的时候,它要执行以下行为:
-->打开爆米花机,开始做爆米花
-->将灯光调暗
-->放下屏幕
-->打开投影仪
...
当“享受”完这个家庭影院后,又要执行以下的关闭操作:
-->关了爆米花机
-->关闭音响
-->收起屏幕
-->关闭投影仪
...
如果要花那么多时间做这些功夫,还不如去电影院。
所以外观模式就是希望能将这个多工作都简化成我只需要按一个按钮,就能开始看电影,按钮一个按钮,就能关闭所以的设备。
2.使用场景
去医院看病,可能要去挂号、门诊、划价、取药,让患者或患者家属觉得很复杂,如果有提供接待人员,只让接待人员来处理,就很方便。
3.优点和缺点
优点
1、减少系统相互依赖。
2、提高灵活性。
3、提高了安全性。
缺点
不符合开闭原则,如果要改东西很麻烦,继承重写都不合适
4.例子解析
直接附上《Head First Design Patterns》的外观模式类图:
外观模式类图下面的例子就是关于开头提到的家庭影院:
家庭影院组成:(把家庭影院当作子系统)
设备一:爆米花机
public class PopcornPopper {
String name = "爆米花机";
public PopcornPopper() {
}
public void on() {
System.out.println("打开 "+name);
}
public void pop() {
System.out.println("正在制作爆米花");
}
public void off() {
System.out.println("关闭 "+name);
}
}
设备二:灯光调节
public class TheaterLights {
public TheaterLights() {
// TODO Auto-generated constructor stub
}
public void dim(int i) {
System.out.println("灯光调暗到"+i+"%的亮度");
}
public void on() {
System.out.println("打开灯光");
}
public void off() {
System.out.println("关灯");
}
}
其他设备就省略了,具体可以看源码。
然后就是“一键观影”和“一键关影”的遥控器了
遥控器:Facade
public class HomeTheaterFacade {
Amplifier amplifier;
CdPlayer cdPlayer;
DvdPlayer dvdPlayer;
PopcornPopper popper;
Projector projector;
Screen screen;
TheaterLights lights;
Tuner tuner;
public HomeTheaterFacade(Amplifier amplifier, CdPlayer cdPlayer,
DvdPlayer dvdPlayer, PopcornPopper popper, Projector projector,
Screen screen, TheaterLights lights, Tuner tuner) {
this.amplifier = amplifier;
this.cdPlayer = cdPlayer;
this.dvdPlayer = dvdPlayer;
this.popper = popper;
this.projector = projector;
this.screen = screen;
this.lights = lights;
this.tuner = tuner;
}
public void watchMovie(String movie) {
System.out.println("老司机即将开车,即将播放电影《"+movie+"》================");
popper.on();
popper.pop();
lights.dim(10);
screen.down();
projector.on();
amplifier.on();
dvdPlayer.on();
dvdPlayer.play(movie);
}
public void endMovie() {
System.out.println("老司机催促各位乘客下车,电影结束================");
popper.off();
lights.on();
screen.up();
projector.off();
amplifier.off();
dvdPlayer.off();
}
}
客户端:
public class Test {
public static void main(String[] args) {
HomeTheaterFacade homeTheaterFacade = new HomeTheaterFacade(
new Amplifier(), new CdPlayer(), new DvdPlayer(),
new PopcornPopper(), new Projector(), new Screen(),
new TheaterLights(), new Tuner());
homeTheaterFacade.watchMovie("白雪公主和七个小矮人");
System.out.println("\n");
homeTheaterFacade.endMovie();
}
}
5.总结
这些在网上和《Head First Design Pattern》都能找到,写这篇文章是为了帮助自己对知识加深了解,记录当时是怎么想的。人的大脑就那么一个,记录的东西有限,要把大脑当成CPU来使用,而不是当作硬盘来存储。
6.源码地址
http://download.csdn.net/detail/lgywsdy/9750138
网友评论