外观模式(Facade)
定义
为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,使得子系统更容易使用。
使用场景
- 简化复杂系统接口:当一个系统变得复杂且包含许多子系统时,使用外观模式可以提供一个简化的接口,使客户端与系统之间的交互更加简单。
- 解耦客户端与子系统: 外观模式可以将客户端代码与系统的子系统解耦,使客户端不需要直接与复杂的子系统交互。这有助于降低客户端代码的复杂性。
- 提供子系统的单一入口: 外观模式为整个系统提供了一个单一的入口,客户端只需要与外观类交互,而不必直接与多个子系统打交道。
- 封装系统变化: 当系统内部的变化可能影响到客户端代码时,使用外观模式可以将变化封装在外观类中,减少对客户端的影响
- 支持松耦合:外观模式有助于实现系统中的松耦合,因为客户端只需要与外观类进行交互,而不需要了解系统内部的具体实现。
- 简化大型系统的管理: 在大型系统中,有许多模块和子系统,使用外观模式可以简化系统的管理和维护。
主要角色
- 外观类
- 子系统
类图
示例代码
// 子系统1: 库存系统
class InventorySystem {
public boolean checkStock(String productId, int quantity) {
// 检查库存是否足够
System.out.println("检查库存...");
// 省略实际的库存检查逻辑
return true;
}
}
// 子系统2: 订单系统
class OrderSystem {
public String generateOrder(String productId, int quantity, String customerName) {
// 生成订单
System.out.println("生成订单...");
// 省略实际的订单生成逻辑
return "Order#123";
}
}
// 子系统3: 邮件通知系统
class EmailNotificationSystem {
public void sendOrderConfirmationEmail(String orderId, String customerEmail) {
// 发送订单确认邮件
System.out.println("发送订单确认邮件...");
// 省略实际的邮件发送逻辑
}
}
// 外观类
class OnlineShoppingFacade {
private InventorySystem inventorySystem;
private OrderSystem orderSystem;
private EmailNotificationSystem emailNotificationSystem;
public OnlineShoppingFacade() {
this.inventorySystem = new InventorySystem();
this.orderSystem = new OrderSystem();
this.emailNotificationSystem = new EmailNotificationSystem();
}
// 提供一个简化的接口,让客户端可以通过一个方法完成整个购物流程
public void purchase(String productId, int quantity, String customerName, String customerEmail) {
System.out.println("开始购物流程...");
boolean stockAvailable = inventorySystem.checkStock(productId, quantity);
if (stockAvailable) {
String orderId = orderSystem.generateOrder(productId, quantity, customerName);
emailNotificationSystem.sendOrderConfirmationEmail(orderId, customerEmail);
System.out.println("购物流程完成");
} else {
System.out.println("库存不足,购物流程失败");
}
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
// 使用外观类简化购物流程
OnlineShoppingFacade shoppingFacade = new OnlineShoppingFacade();
shoppingFacade.purchase("ProductA", 2, "John Doe", "john@example.com");
}
}