


门面模式(外观模式)
SLF4J是门面模式的典型应用(但不仅仅使用了门面模式)。
门面模式定义
门面模式(Facade Pattern)又称为外观模式,提供了一个统一的接口,用来访问子系统中的一群接口。
其主要特征是定义了一个高层接口,让子系统更容易使用。

门面模式主要包含2种角色:
-
外观角色(Facade):- 也称门面角色,系统对外的统一接口。
-
子系统角色(SubSystem):- 可以同时有
一个或多个SubSystem。 - 每个
SubSystem都不是一个单独的类,而是一个类的集合。 SubSystem并不知道Facade的存在,对于SubSystem而言,Facade只是另一个客户端而已(即Facade对SubSystem透明)。
- 可以同时有
- 比如去医院看病,可能要去挂号、门诊、化验、取药,让患者或患者家属觉得很复杂;
- 如果有提供接待人员,只让接待人员来处理,就很方便。
门面模式的实现
场景:回家,我们会开各个屋的灯。离开家时,会关闭各个屋的灯
如果家里设置一个总开关,来控制整个屋的灯就会很方便。
我们使用门面模式的实现
我们先来定义一个灯接口

接下里,我们定义 Light 的子系统 SubSystem ;
可以有多个 SubSystem ,这里定义两个类:LivingRoomLight,BedRoomLight


接下来,我们定义外观角色(Facade),用于打开所有的灯或者关闭所有的灯:

外观角色需要操控 LivingRoomLight,BedRoomLight 这两个子系统,所以也要有子系统 on() 和 off() 对应的方法:

上面为了方便,直接在外观角色中实现了 Light 接口,但是我们也可以不实现,都是可以的:
门面模式是设计思想的一种,重思想,轻代码实现


这时候,我们需要 main 方法来表示客户端:

不使用门面模式,我们开关灯的客户端写法如上图所示;
如果我们引入门面模式:

并且通过门面模式,我们修改子系统的内容,并不会影响客户端 Main 的使用;
门面模式的优点
减少了系统的相互依赖,实现了客户端与子系统的耦合关系,这使得子系统的变化不会影响到调用它的客户端;提高了灵活性,简化了客户端对子系统的使用难度,客户端无需关心子系统的具体实现方式,而只需要和门面对象交互即可。提高了安全性。可以灵活设定访问权限,不在门面对象中开通方法,就无法访问。



