门面模式

##门面模式

门面模式是一种结构型设计模式,它提供了一个统一的接口,用来访问子系统中的一群接口。它定义了一个高层接口,让子系统更容易使用。这种模式常用于将一个复杂的子系统封装成一个简单的接口,使得客户端可以方便地使用子系统的功能,而不需要了解子系统的具体实现细节。

##门面模式的特点

  • 代理模式能够隐藏真实对象的实现细节,使客户端无需知晓真实对象的工作方式和结构。
  • 通过代理类来间接访问真实类,可以在不修改真实类的情况下对其进行扩展、优化或添加安全措施。
  • 代理模式实现起来简单,易于扩展和维护,符合面向对象设计原则中的开闭原则。

门面模式的核心角色

门面角色(Facade):这是门面模式的核心,被客户角色调用。它熟悉子系统的功能,内部根据客户角色已有的需求预定了几种功能组合,其拥有子系统的引用

子系统角色(Subsystem):实现了子系统的功能。对于子系统角色来说,门面角色和客户角色都是未知的,它没有任何门面角色信息和链接。

客户角色(Client):这是使用门面模式的外部请求者,它通过门面角色来访问子系统,以获取所需的功能。

例子

image-20231229121655025

抽象门面

1
2
3
4
public abstract class AbstractSwitch {
public abstract void on();
public abstract void off();
}

具体门面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Switch extends AbstractSwitch{
private Light light;
private TV tv;
private Fan fan;
public Switch(){
light = new Light();
tv = new TV();
fan = new Fan();
}
@Override
public void on() {
light.on();
tv.on();
fan.on();
}

@Override
public void off() {
light.off();
tv.off();
fan.off();
}
}

子系统

1
2
3
4
5
6
7
8
9
public class Fan {
public void on(){
System.out.println("开风扇");
}
public void off(){
System.out.println("关风扇");
}
}

1
2
3
4
5
6
7
8
9
public class Light {
public void on(){
System.out.println("开灯");
}
public void off(){
System.out.println("关灯");
}
}

1
2
3
4
5
6
7
8
public class TV {
public void on(){
System.out.println("开电视");
}
public void off(){
System.out.println("关电视");
}
}

客户端

1
2
3
4
5
6
7
8
public class Client {
public static void main(String[] args) {
AbstractSwitch switch1 = new Switch();
switch1.on();
switch1.off();
}
}

image-20231229121452776

优点

  • 减少系统的相互依赖:门面模式可以让客户端只需要依赖门面对象,而与子系统无关。这样可以降低系统耦合度。
  • 提高灵活性:通过门面角色,客户端不再直接与子系统交互,而是通过门面角色提供的精简接口来实现交互。这样,子系统的内部实现细节可以被隐藏起来,子系统如何变化对客户端来说是透明的,提高了系统的灵活性。
  • 提高安全性:外部只能通过门面访问子系统的功能,门面没有开放的就不能访问,提高了子系统的安全性。

缺点

  • 不符合开闭原则。系统投产后,一旦发现错误,只能修改门面角色的代码,风险比较大
  • 系统的复杂性和理解难度有一定增加

门面模式的应用场景

  • 子系统越来越复杂,增加门面模式提供简单接口
  • 构建多层系统结构,利用门面对象作为每层的入口,简化层间调用

门面模式
http://example.com/2023/10/15/计算机基础/设计模式/09-门面模式/
作者
PALE13
发布于
2023年10月15日
许可协议