设计模式-6-外观模式

81 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

外观模式(Facade Pattern)应该是最好理解的一个设计模式了,在我们项目中向外部提供一个外部可以访问系统的接口,然由这个接口去耦合子系统或者子接口,外部与子接口完全解耦。这种类型的设计模式属于结构型模式。

        我们国家最近提出了“进一个门,办所有事”的概念,无论你办什么事情都可以去政务大厅办理,不需要挨个去各个部门跑啦,政务大厅就是对外的接口,各个部门是子接口,你只要找到政务大厅就可以,不需要管各个部门在哪里。大大降低了复杂性!

        在项目中,我们有3个子接口,往常我们要分别取调用这3个接口来实现不同的功能,现在我们添加一个对外接口,外部只调用这个对外接口,由对外接口去调用3个子接口,我们不管3个子接口啥情况,只要交互外部接口就好,这就是外观模式。

代码实现一下哈:

一、建个接口

package com.xing.design.facade;public class PlayQ implements Play {@Overridepublic void playSome() {    System.out.println("我想玩球...");  }}
package com.xing.design.facade;public class PlayDQ implements Play {@Overridepublic void playSome() {    System.out.println("我想玩大球...");  }}
package com.xing.design.facade;public class PlayDQQ implements Play {@Overridepublic void playSome() {    System.out.println("我想玩两个大球...");  }}

三、搞一个外观类

package com.xing.design.facade;
public class PlayMake {
private Play playQ;private Play playDQ;private Play playDQQ;
public PlayMake(){    playQ = new PlayQ();    playDQ = new PlayDQ();    playDQQ = new PlayDQQ();  }
public void playQ() {    playQ.playSome();  }public void playDQ() {    playDQ.playSome();  }public void playDQQ() {    playDQQ.playSome();  }}

四、直接交互外观类来调用3个子接口:

package com.xing.design.facade;
public class FacadeDemo {public static void main(String[] args) {    PlayMake playMake = new PlayMake();    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

本文已参与「新人创作礼」活动,一起开启掘金创作之路。