外观模式
外观模式又叫门面模式,提供一个统一的接口,来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。
这里我们使用观看电影的实例,我们假设观看一部影片(watchMovie())的步骤:1.投影开2.幕布放下3.DVD播放4.音响打开;结束放映(closed())的操作应该是反过来的
实践步骤:
1>我们新建一个投影机(Diascope)类、幕布(Curtain)类、DVD类、音响(Sounder)类
package com.kaishengit.facade; public class Diascope { public void on(){ System.out.println("投影开"); } public void off(){ System.out.println("投影关"); } }
package com.kaishengit.facade; public class Curtain { public void put(){ System.out.println("幕布放下"); } public void get(){ System.out.println("幕布收起来"); } }
package com.kaishengit.facade; public class Dvd { public void play(){ System.out.println("DVD播放"); } public void close(){ System.out.println("DVD关闭"); } }
package com.kaishengit.facade; public class Sounder { public void on(){ System.out.println("音响打开"); } public void off(){ System.out.println("音响关闭"); } }
2>我们新建一个外观(Facade)类
package com.kaishengit.facade; public class Facade { private Diascope diascope; private Curtain curtain; private Dvd dvd; private Sounder sounder; /** * 通过构造方法分别传入投影仪、幕布、Dvd、音响对象 * @param diascope * @param curtain * @param dvd * @param sounder */ public Facade(Diascope diascope,Curtain curtain,Dvd dvd,Sounder sounder){ this.diascope = diascope; this.curtain = curtain; this.dvd = dvd; this.sounder = sounder; } /** * 观看影片 */ public void watchMovie(){ diascope.on();//投影开 curtain.put();//幕布放下 dvd.play();//Dvd播放 sounder.on();//音响打开 } /** * 结束放映 */ public void closed(){ sounder.off();//音响关闭 dvd.close();//Dvd关闭 curtain.get();//幕布拉上 diascope.off();//投影关闭 } }
3>我们测试一下
package com.kaishengit.facade; public class Test { public static void main(String[] args) { Facade facade = new Facade(new Diascope(), new Curtain(), new Dvd(), new Sounder()); facade.watchMovie();//观看放映 //facade.closed();//结束放映 } }
运行结果:
-------------------------------
投影开
幕布放下
DVD播放
音响打开
-------------------------------
关于外观模式
1>当需要简化并统一一个很大的接口或者一群复杂的接口时,应该使用外观模式
2>外观将客户从一个复杂的子系统中解耦
3>实现一个外观,需要将子系统组合进外观中,然后将工作委托给子系统完成
4>你可以为子系统实现一个以上的外观
5>适配器模式重点在于转换,外观模式重点在于简化
-------end-----------