本文最后更新于 2025年7月25日 下午
门面模式提供了一个统一的接口,用于访问子系统中的功能,外观模式定义了一个高层接口,让子系统更容易使用
角色
- 门面角色 :门面模式的核心,被客户角色调用,它熟悉子系统的功能,内部根据客户角色的需求预定了几种功能的组合
- 子系统角色 :实现了子系统功能,对客户角色和门面角色是未知的。它的内部可以有系统内的相互交互,也可以有供外界调用的接口
- 客户角色 :通过调用门面角色完成要实现的功能
优点
- 降低了客户类与子系统类的耦合度,实现了子系统与客户之间的松耦合关系
- 只提供了一个访问子系统的统一入口,并不影响用户直接使用子系统类
- 减少了与子系统的关联对象,实现了子系统与客户之间的松耦合关系,松耦合使得子系统的组件变化不会影响到它的客户
- 外观模式对客户屏蔽了子系统组件,从而简化了接口,减少了客户处理的对象数目,并使子系统的使用更加简单
- 引入外观角色之后,用户只需要与外观角色交互即可
- 用户与子系统之间的复杂逻辑关系由外观角色来实现
- 降低原有系统的复杂度和系统中的编译依赖性
缺点
在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码。
不能很好地限制客户使用子类系统,如果对客户访问子系统类做出太多的限制,则减少了可变性和灵活性。
场景
门面模式一般用于在系统网关位置提供统一接口,对外提供明确间接的调用方法。在内部定义响应的绑定方案。
实现门面模式
系统内部的多个子系统
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| public class SubSystemLight{ public void on(){ System.out.println("开灯"); } public void off(){ System.out.println("关灯"); } }
public class SubSystemSunblind{ public void on(){ System.out.println("打开窗帘"); } public void off(){ System.out.println("关闭窗帘"); } }
public class SubSystemTV{ public void on(){ System.out.println("打开电视"); } public void off(){ System.out.println("关闭电视") } }
public class DeviceFacade{ private SubSystemLight light = new SubSystemLight(); private SubSystemSunblind sunblind = new SubSystemSunblind(); private SubSystemTV tv = new SubSystemTV();
public void on(){ light.on(); sunblind.on(); tv.on(); }
public void off(){ light.off(); sunblind.off(); tv.off(); } }
public class Test{ public static void main(String[] args){ DeviceFacade deviceFacade = new DeviceFacade(); deviceFacade.on(); deviceFacade.off(); }
}
|
总结
门面模式的核心在于“统一接口、简化使用、解耦子系统”,它是架构设计中实现模块隔离、降低耦合度的重要手段。在微服务网关、系统适配层、三方服务集成等场景中,门面模式均有广泛应用。值得注意的是,门面并不限制直接访问子系统,因此更强调“简化”和“组合”而非“强控制”。合理使用门面模式,可以有效提高系统的可维护性与清晰度。