盒礁泅 发表于 2025-6-27 08:36:18

【设计模式】外观模式

外观模式深度解析:复杂系统的统一之门

一、外观模式核心概念

外观模式(Facade Pattern)是一种结构型设计模式,为复杂的子系统提供一个简化的统一接口。它充当系统与客户端之间的中间层,隐藏系统的复杂性,提供更简洁、更易用的操作方式。
核心价值:


[*]✅ 简化复杂系统:提供单一入口点,降低使用门槛
[*]✅ 解耦客户端与子系统:客户端只需与外观类交互
[*]✅ 提高可维护性:子系统内部变化不影响客户端
[*]✅ 统一异常处理:集中管理错误处理逻辑
二、为什么需要外观模式?

当面临以下场景时,外观模式是理想解决方案:

[*]系统过于复杂:多个子系统相互依赖,调用流程繁琐
[*]客户端需要简化操作:用户只需核心功能,无需了解内部细节
[*]分层架构需求:需要清晰的分界线隔离不同层级
[*]遗留系统集成:包装旧系统提供现代化接口
graph LR    Client --> Facade[外观类]    Facade --> SubsystemA[子系统A]    Facade --> SubsystemB[子系统B]    Facade --> SubsystemC[子系统C]    SubsystemA --> SubsystemB    SubsystemB --> SubsystemC三、外观模式实现方式

1. 基础实现(标准模式)

// 子系统类:库存管理
class InventorySystem {
    public boolean checkStock(String productId, int quantity) {
      System.out.println("检查库存: " + productId);
      // 实际库存检查逻辑
      return Math.random() > 0.3; // 模拟70%有货
    }
}

// 子系统类:支付处理
class PaymentSystem {
    public boolean processPayment(String userId, double amount) {
      System.out.println("处理支付: $" + amount);
      // 实际支付处理逻辑
      return Math.random() > 0.2; // 模拟80%支付成功
    }
}

// 子系统类:物流配送
class ShippingSystem {
    public String scheduleDelivery(String address) {
      System.out.println("安排配送至: " + address);
      // 实际物流调度逻辑
      return "TRK-" + System.currentTimeMillis();
    }
}

// 外观类:电商平台接口
class ECommerceFacade {
    private InventorySystem inventory = new InventorySystem();
    private PaymentSystem payment = new PaymentSystem();
    private ShippingSystem shipping = new ShippingSystem();
   
    public String placeOrder(String userId, String productId,
                           int quantity, String address) {
      // 步骤1:检查库存
      if (!inventory.checkStock(productId, quantity)) {
            throw new RuntimeException("商品库存不足");
      }
      
      // 步骤2:处理支付
      double amount = quantity * 99.9; // 计算金额
      if (!payment.processPayment(userId, amount)) {
            throw new RuntimeException("支付失败");
      }
      
      // 步骤3:安排配送
      String trackingId = shipping.scheduleDelivery(address);
      
      return "订单创建成功! 运单号: " + trackingId;
    }
}

// 客户端使用
public class Client {
    public static void main(String[] args) {
      ECommerceFacade facade = new ECommerceFacade();
      String result = facade.placeOrder("user123", "P1001", 2, "北京市朝阳区");
      System.out.println(result);
    }
}2. 进阶实现:带配置选项的外观

class SmartHomeFacade {
    private LightingSystem lighting;
    private ClimateSystem climate;
    private SecuritySystem security;
   
    // 可配置的子系统
    public SmartHomeFacade(LightingSystem lighting,
                        ClimateSystem climate,
                        SecuritySystem security) {
      this.lighting = lighting;
      this.climate = climate;
      this.security = security;
    }
   
    // 场景模式:离家模式
    public void awayMode() {
      security.armSystem();
      lighting.turnOffAll();
      climate.setEcoMode();
      System.out.println("离家模式已激活");
    }
   
    // 场景模式:回家模式
    public void homeMode() {
      security.disarmSystem();
      lighting.turnOnLivingRoom();
      climate.setComfortMode(22);
      System.out.println("欢迎回家");
    }
}四、外观模式原理深度剖析


来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 【设计模式】外观模式