设计模式之外观模式

外观模式(Facade)

定义

为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,使得子系统更容易使用。

使用场景

  1. 简化复杂系统接口:当一个系统变得复杂且包含许多子系统时,使用外观模式可以提供一个简化的接口,使客户端与系统之间的交互更加简单。
  2. 解耦客户端与子系统: 外观模式可以将客户端代码与系统的子系统解耦,使客户端不需要直接与复杂的子系统交互。这有助于降低客户端代码的复杂性。
  3. 提供子系统的单一入口: 外观模式为整个系统提供了一个单一的入口,客户端只需要与外观类交互,而不必直接与多个子系统打交道。
  4. 封装系统变化: 当系统内部的变化可能影响到客户端代码时,使用外观模式可以将变化封装在外观类中,减少对客户端的影响
  5. 支持松耦合:外观模式有助于实现系统中的松耦合,因为客户端只需要与外观类进行交互,而不需要了解系统内部的具体实现。
  6. 简化大型系统的管理: 在大型系统中,有许多模块和子系统,使用外观模式可以简化系统的管理和维护。

主要角色

  1. 外观类
  2. 子系统

类图

image-20231227164034983

示例代码

// 子系统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");
    }
}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值