门面模式

本文最后更新于 2025年7月25日 下午

门面模式提供了一个统一的接口,用于访问子系统中的功能,外观模式定义了一个高层接口,让子系统更容易使用

角色

  1. 门面角色 :门面模式的核心,被客户角色调用,它熟悉子系统的功能,内部根据客户角色的需求预定了几种功能的组合
  2. 子系统角色 :实现了子系统功能,对客户角色和门面角色是未知的。它的内部可以有系统内的相互交互,也可以有供外界调用的接口
  3. 客户角色 :通过调用门面角色完成要实现的功能

优点

  1. 降低了客户类与子系统类的耦合度,实现了子系统与客户之间的松耦合关系
    1. 只提供了一个访问子系统的统一入口,并不影响用户直接使用子系统类
    2. 减少了与子系统的关联对象,实现了子系统与客户之间的松耦合关系,松耦合使得子系统的组件变化不会影响到它的客户
  2. 外观模式对客户屏蔽了子系统组件,从而简化了接口,减少了客户处理的对象数目,并使子系统的使用更加简单
    1. 引入外观角色之后,用户只需要与外观角色交互即可
    2. 用户与子系统之间的复杂逻辑关系由外观角色来实现
  3. 降低原有系统的复杂度和系统中的编译依赖性

缺点

在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码。

不能很好地限制客户使用子类系统,如果对客户访问子系统类做出太多的限制,则减少了可变性和灵活性。

场景

门面模式一般用于在系统网关位置提供统一接口,对外提供明确间接的调用方法。在内部定义响应的绑定方案。

实现门面模式

系统内部的多个子系统

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();
}

}

总结

门面模式的核心在于“统一接口、简化使用、解耦子系统”,它是架构设计中实现模块隔离、降低耦合度的重要手段。在微服务网关、系统适配层、三方服务集成等场景中,门面模式均有广泛应用。值得注意的是,门面并不限制直接访问子系统,因此更强调“简化”和“组合”而非“强控制”。合理使用门面模式,可以有效提高系统的可维护性与清晰度。


门面模式
http://gadoid.io/2025/07/25/门面模式/
作者
Codfish
发布于
2025年7月25日
许可协议