设计模式:外观模式
外观模式:提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。
场景:有一个家庭影院,里面有爆米花机,投影,DVD机,音响等,然后等我们要开始享观赏电影的时候,我们不得不执行打开爆米花机,开始爆米,关闭爆米花机,关闭灯,放在投影....等等一系列操作,然后观赏完电影,还有在关闭这些东西,这多累人啊。这时候,我们就可以利用外观模式,提供一个合理的接口的外观类,让你只需一键完成一系列操作。下面我们看下代码的实现
首先我们创建一系列子系统
//爆米花类 public class Popper { public void on(){ System.out.println("打开爆米花机"); } public void pop(){ System.out.println("爆米花机开始爆米"); } public void off(){ System.out.println("关闭爆米花机"); } } //电灯类 public class Light { public void on(){ System.out.println("打开电灯"); } public void off(){ System.out.println("关闭电灯"); } } //投影类 public class Projector { public void open(){ System.out.println("打开投影"); } public void close(){ System.out.println("关闭投影"); } } //音响类 public class Stereo { public void on(){ System.out.println("打开音响"); } public void off(){ System.out.println("关闭音响"); } public void setDVD(){ System.out.println("设置DVD模式"); } public void setSurroundSound(){ System.out.println("设置四周环绕声音"); } } //dvd类 public class Dvd { public void setDVD(String movie){ System.out.println("放置DVD:" + movie); } public void play(){ System.out.println("播放电影" ); } public void off(){ System.out.println("关闭DVD"); } public void removeDVD(){ System.out.println("取出影片"); } } //屏幕类 public class Screen { public void up(){ System.out.println("拉起屏幕"); } public void down(){ System.out.println("放下屏幕"); } }
接着我们创建一个外观模式的接口
//设置一个接口HomeMovieFacade来连接客户和组件(音响、DVD)之间的操作 public class HomeMovieFacade { //创建组合 Dvd dvd; Light light; Popper popper; Projector projector; Screen screen; Stereo stereo; //外观将子系统中每一个组件通过构造方法都引入进来赋给相应的值 public HomeMovieFacade(Dvd dvd,Light light,Projector projector, Popper popper,Screen screen,Stereo stereo){ this.dvd = dvd; this.light = light; this.popper = popper; this.projector = projector; this.screen = screen; this.stereo = stereo; } //开始享受家庭影院,这方法将我们之前每次需要手动处理的任务都交给子系统处理了。 public void watchMovie(String movie){ System.out.println("准备开始看电影了!"); popper.on(); popper.pop(); popper.off(); light.off(); screen.down(); projector.open(); stereo.on(); stereo.setDVD(); stereo.setSurroundSound(); dvd.setDVD(movie); dvd.play(); } //享受完关闭影院 public void endMovie(){ System.out.println("看完电影要收拾了!"); light.on(); screen.up(); projector.close(); stereo.off(); dvd.off(); dvd.removeDVD(); } }
最后我们来进行测试,也就是客户类
public class Test { public static void main(String[] args) { //实例化各个组件 Dvd dvd = new Dvd(); Light light = new Light(); Popper popper = new Popper(); Projector projector = new Projector(); Screen screen = new Screen(); Stereo stereo = new Stereo(); //实例化外观对象,只需利用外观对象的一个方法来进行一系列子系统的操作,不关心子系统的一系列操作 HomeMovieFacade homeMovieFacade = new HomeMovieFacade(dvd, light, projector, popper, screen, stereo); homeMovieFacade.watchMovie("设计模式电影"); System.out.println("------------"); homeMovieFacade.endMovie(); } }
下面是运行的结果
好了,这就是一个简单的外观模式的使用范例了。最后说下装饰者、适配器、外观这三个模式的区别。装饰者意图是不改变接口,但加入责任,适配器是将一个接口转成另一个接口,而外观是为了让接口更简单。
下一节:模板方法模式
作者:哀&RT
出处:博客园哀&RT的技术博客--http://www.cnblogs.com/Tony-Anne/
您的支持是对博主最大的鼓励,感谢您的认真阅读。
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
出处:博客园哀&RT的技术博客--http://www.cnblogs.com/Tony-Anne/
您的支持是对博主最大的鼓励,感谢您的认真阅读。
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。