门面模式(外观模式)
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 的使用;
门面模式的优点
减少了系统的相互依赖
,实现了客户端与子系统的耦合关系,这使得子系统的变化不会影响到调用它的客户端;提高了灵活性
,简化了客户端对子系统的使用难度,客户端无需关心子系统的具体实现方式,而只需要和门面对象交互即可。提高了安全性
。可以灵活设定访问权限,不在门面对象中开通方法,就无法访问。