外观模式提供了一个统一的接口,用来方位子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。
类图
java代码
// 屏幕
public class Screen {
public void down() {
System.out.println("screen down ...");
}
public void up() {
System.out.println("screen up ...");
}
}
// 音响
public class Stereo {
public void on() {
System.out.println("stereo on ...");
}
public void off() {
System.out.println("stereo off ...");
}
public void setVolume(int volume) {
System.out.println("stereo volume set " + volume);
}
}
// dvd播放机
public class DVDPlayer {
private String name;
public void on() {
System.out.println("dvd player on ...");
}
public void off() {
System.out.println("dvd player off ...");
}
public void insertDVD(String name) {
this.name = name;
System.out.println("DVD " + name + " insert ...");
}
public void takeDVD() {
this.name = "";
System.out.println("DVD " + name + " take ...");
}
}
// 外观对象
public class EasyUse {
private Screen screen;
private Stereo stereo;
private DVDPlayer dvdPlayer;
public EasyUse(Screen screen, Stereo stereo, DVDPlayer dvdPlayer) {
this.screen = screen;
this.stereo = stereo;
this.dvdPlayer = dvdPlayer;
}
public void on() {
screen.down();
stereo.on();
stereo.setVolume(10);
dvdPlayer.on();
dvdPlayer.insertDVD("XXX DVD");
}
public void off() {
dvdPlayer.takeDVD();
dvdPlayer.off();
stereo.setVolume(0);
stereo.off();
screen.up();
}
}
// 测试对象
public class Test {
public static void main(String[] args) {
new Test().test();
}
private void test() {
// 创建电器对象
Screen screen = new Screen();
Stereo stereo = new Stereo();
DVDPlayer dvdPlayer = new DVDPlayer();
EasyUse easyUse = new EasyUse(screen, stereo, dvdPlayer);
easyUse.on();
easyUse.off();
}
}
注:
现在我们可以很方便的看一场电影,不需要再打开和设置各种电器
提供简化接口的同时,依然将系统完整的功能暴露出来,以供需要的人使用
将客户从组件的子系统中解耦
外观模式需要区别于适配器模式(可参考我的另一篇文章),两者目的不同
外观模式:提供子系统的一个简化接口
适配器模式:伪装接口符合客户的期望
参考文章
1. Head First 设计模式