掌握设计模式 -- 外观模式
外观模式
外观模式 (Facade Pattern) ,又称为门面模式,是一种结构型设计模式,它通过为一组复杂的子系统提供一个简化的接口,使得客户端可以更容易地访问和使用这些子系统的功能。外观模式隐藏了系统的复杂性,对外提供了一个简单的接口,从而减少了外部系统与子系统之间的依赖关系,提高了系统的可维护性和可扩展性。比如,一个操作系统中有多个复杂的子系统,操作系统的应用
与操作系统的底层
交互便是通过操作系统接口
来实现,应用层的开发不可能直接操作各个子系统的实现,使用外观模式实现分层结构
,这样隐藏复杂的底层逻辑的同时简化应用层开发,大大降低耦合度。
主要结构
外观 (Facade):为一组复杂的子系统提供简化的接口。
子系统 (Subsystem):实现具体功能的复杂系统,客户端不需要直接与这些子系统交互。
客户端 (Client):需要使用子系统功能的外部代码或模块。
案例实现
假设我们有一个子系统涉及多个模块,比如门禁控制、灯光控制和空调控制。使用外观模式,我们可以提供一个简化的接口来控制所有这些设备。
案例类图
子系统类
外观类
客户端测试
测试结果
当到家时:
--开门...
--开灯...
--打开空调...
当离家时:
--关灯...
--关闭空调...
--关门...
简单分析
子系统类:DoorSystem
、LightSystem
和 ACSystem
是独立的模块,它们负责具体的功能。
外观类:SmartHomeFacade
提供了一个简化的接口 (arriveHome
和 leaveHome
),通过它,客户端可以简化与各个子系统的交互。
客户端代码:客户端通过 SmartHomeFacade
调用 arriveHome
或 leaveHome
方法来控制门、灯和空调。
通过这种方式,外观模式将复杂的操作封装在一个简单的接口后,客户端无需了解子系统的细节,只需调用外观类提供的简化方法即可。
优缺点和应用场景
优点
简化接口:客户端通过外观接口与复杂的子系统进行交互,避免了直接与多个子系统打交道。
减少依赖:客户端只依赖外观类,减少了与复杂子系统之间的耦合度。
提高系统的灵活性:外观模式为系统提供了一种更简洁的方式来调用子系统,修改子系统时只需要更改外观类,而客户端无需修改。
易于使用:通过提供简单的接口,使得系统的使用更加直观,便于理解。
缺点
引入额外的层次:虽然外观模式简化了接口,但它也引入了一个额外的层次。如果系统本身已经很简单,可能就没有必要使用外观模式。
限制灵活性:外观模式将系统的复杂性隐藏在外部接口后,可能会限制客户端对子系统的细粒度控制。
应用场景
复杂子系统的简化:当系统复杂,且客户端需要通过多个复杂接口进行交互时,可以使用外观模式来简化接口。
集成多个子系统:当多个子系统协同工作时,外观模式可以为这些子系统提供一个统一的接口。
需要解耦的场景:外观模式适用于减少客户端与子系统之间耦合度的场景。
总结
外观模式通过将复杂系统的实现细节隐藏起来,提供一个简单的接口,使得客户端代码更加简洁,降低了系统间的耦合度。这种模式非常适用于需要简化复杂子系统交互的场景。
文章转载自:渊渟岳
评论