外观模式(Facade Pattern)应该是最好理解的一个设计模式了,在我们项目中向外部提供一个外部可以访问系统的接口,然由这个接口去耦合子系统或者子接口,外部与子接口完全解耦。这种类型的设计模式属于结构型模式。
我们国家最近提出了“进一个门,办所有事”的概念,无论你办什么事情都可以去政务大厅办理,不需要挨个去各个部门跑啦,政务大厅就是对外的接口,各个部门是子接口,你只要找到政务大厅就可以,不需要管各个部门在哪里。大大降低了复杂性!
在项目中,我们有3个子接口,往常我们要分别取调用这3个接口来实现不同的功能,现在我们添加一个对外接口,外部只调用这个对外接口,由对外接口去调用3个子接口,我们不管3个子接口啥情况,只要交互外部接口就好,这就是外观模式。
代码实现一下哈:
一、建个接口
packagecom.xing.design.facade; /*** 玩* @author xing*/publicinterfacePlay { voidplaySome(); }
二、建立三个不同功能的类:
packagecom.xing.design.facade; publicclassPlayQimplementsPlay { publicvoidplaySome() { System.out.println("我想玩球..."); } } packagecom.xing.design.facade; publicclassPlayDQimplementsPlay { publicvoidplaySome() { System.out.println("我想玩大球..."); } } packagecom.xing.design.facade; publicclassPlayDQQimplementsPlay { publicvoidplaySome() { System.out.println("我想玩两个大球..."); } }
三、搞一个外观类
packagecom.xing.design.facade; publicclassPlayMake { privatePlayplayQ; privatePlayplayDQ; privatePlayplayDQQ; publicPlayMake(){ playQ=newPlayQ(); playDQ=newPlayDQ(); playDQQ=newPlayDQQ(); } publicvoidplayQ() { playQ.playSome(); } publicvoidplayDQ() { playDQ.playSome(); } publicvoidplayDQQ() { playDQQ.playSome(); } }
四、直接交互外观类来调用3个子接口:
packagecom.xing.design.facade; publicclassFacadeDemo { publicstaticvoidmain(String[] args) { PlayMakeplayMake=newPlayMake(); playMake.playQ(); playMake.playDQ(); playMake.playDQQ(); } }
五、结果
可以看到我们只交互了外观类PlayMake,子接口对我们是完全隐藏的,我们并不用去关注子接口的球是玩的多么复杂,这就简化了我们的调用。
同时这里也可以看出外观模式的缺点,如果我要不止是玩两个球,还想玩别的,那我就要修改外观类和外部调用代码,这就违反了“开闭原则”。
PS:开闭原则
1988年,勃兰特·梅耶(Bertrand Meyer)在他的著作《面向对象软件构造(Object Oriented Software Construction)》中提出了开闭原则,它的原文是这样:“Software entities should be open for extension,but closed for modification”。翻译过来就是:“软件实体应当对扩展开放,对修改关闭”。这句话说得略微有点专业,我们把它讲得更通俗一点,也就是:软件系统中包含的各种组件,例如 模块(Modules)、 类(Classes)以及 功能(Functions)等等,应该在不修改现有代码的基础上,引入新功能。开闭原则中“开”,是指对于组件 功能的扩展是开放的,是允许对其进行功能扩展的;开闭原则中“闭”,是指对于原有代码的修改是封闭的,即不应该修改原有的代码。
总结:
外观模式就是将复杂的子模块功能进行封装,外部调用只交互提供的外观类,由外观类去和子模块交互,降低系统使用的复杂性和耦合度。
END