工作五年了,居然还不懂 门面模式!

1. 门面模式介绍

门面模式,也称外观模式,是一种结构型设计模式。它提供了一个高层次的接口,以便于客户端能够使用低层次的模块。门面模式的主要目的是简化接口,使客户端代码更加清晰易懂。

门面模式可以将一个复杂的系统分解成很多模块,每个模块只负责自己的一部分功能。这些模块之间的交互通常是复杂且不易理解的。使用门面模式,我们可以将这些复杂的交互逻辑隐藏在一个简单的门面接口中,使系统更加易于使用。

2. 门面模式的应用场景

2.1. 复杂系统的简化

当系统变得越来越复杂时,将其分解成许多模块是常见的做法。但是,这些模块之间的交互往往也变得更加复杂和困难。使用门面模式,可以将这些复杂的交互逻辑隐藏在一个简单的门面接口中,使系统更加易于使用。

下面我们以一个图形界面系统为例来说明这个场景。一个图形界面系统通常包括多个模块,如窗体、菜单、工具条、按钮等等。这些模块之间的交互十分复杂,因为用户可能会对他们进行各种不同的操作。使用门面模式,可以将这些复杂的交互逻辑隐藏在一个简单的门面接口中,用户不需要关心模块之间的细节,只需要使用简单的接口就可以实现想要的功能。

public class GuiFacade {

private final Window window;

private final Menu menu;

private final ToolBar toolBar;

public GuiFacade() {

window = new Window();

menu = new Menu();

toolBar = new ToolBar();

}

public void run() {

window.display();

menu.display();

toolBar.display();

}

}

在上述示例代码中,我们定义了一个名为GuiFacade的门面类,调用run方法就可以启动整个图形界面系统。

2.2. 封装复杂的操作

当需要执行一些复杂的操作时,我们可以使用门面模式来封装这些操作。这样,客户端只需要调用一个简单的接口,就可以完成一系列复杂的操作。

以一个在线购物系统为例。当用户购买商品时,需要进行多个操作,如验证用户信息、计算价格、生成订单、填写收货地址等等。这些操作之间的关系复杂且不易理解。我们可以使用门面模式,将这些操作封装在一个名为OrderFacade的门面中,用户只需要调用该门面提供的简单接口,所有操作就会自动进行。

public class OrderFacade {

private final UserValidator userValidator;

private final PriceCalculator priceCalculator;

private final OrderGenerator orderGenerator;

private final AddressFiller addressFiller;

public OrderFacade() {

userValidator = new UserValidator();

priceCalculator = new PriceCalculator();

orderGenerator = new OrderGenerator();

addressFiller = new AddressFiller();

}

public void makeOrder() {

if (!userValidator.validate()) {

return;

}

double price = priceCalculator.calculate();

String order = orderGenerator.generate(price);

addressFiller.fill(order);

}

}

在上述示例代码中,我们定义了一个名为OrderFacade的门面类,调用makeOrder方法就可以自动进行所有的购物操作。

3. 门面模式的优缺点

3.1. 优点

简化接口:门面模式可以将复杂的接口简化为一个简单的门面接口,使客户端代码更加清晰易懂。

隔离复杂性:门面模式可以将系统内部的复杂性隔离起来,封装在一个简单的门面接口之后。

松耦合:门面模式可以减少系统内部模块之间的耦合度,使得系统更加灵活可扩展。

3.2. 缺点

可能会隐藏系统的本质复杂性:门面模式可能会让你误以为系统很简单,而实际上却很复杂。这会导致你对系统的本质复杂性失去了认识。

可能会增加门面类的复杂性:门面模式可能会导致门面类变得非常复杂,不易理解和维护。

4. 总结

门面模式是一种结构型设计模式,它提供了一个高层次的接口,以便于客户端能够使用低层次的模块。门面模式可以将系统内部的复杂性隔离起来,封装在一个简单的门面接口之后。使用门面模式,可以让客户端代码更加清晰易懂,减少系统内部模块之间的耦合度。

虽然门面模式可能会让你误以为系统很简单,而实际上却很复杂,但是它仍然是一种非常有用的设计模式。在适当的情况下使用门面模式,可以大大提高代码的可维护性和可扩展性。

后端开发标签