设计模式之外观模式

目录

定义

外观模式(Facade Pattern)‌ 是一种结构型设计模式,它提供了一个统一的接口,用来访问子系统中的一组接口。外观模式定义了一个高层接口,这个接口使得子系统更容易使用。

结构

适用场景

1)为复杂的子系统提供简单入口

2)统一管理系统中存在的多个复杂的子系统

3)解耦客户端与多个子系统之间的依赖关系

4)分层系统中,作为层与层之间的通信接口

5)为遗留系统提供新的简化接口

使用示例

简单的电商订单示例

定义各个模拟子系统

复制代码
/**
 * 库存子系统
 */
public class InventoryService {

    public boolean checkStock(String productId, int quantity) {
        System.out.println("检查库存: 产品" + productId + " 数量" + quantity);
        return true;
    }

    public void lockStock(String productId, int quantity) {
        System.out.println("锁定库存: 产品" + productId + " 数量" + quantity);
    }

}

/**
 * 通知子系统
 */
public class NotificationService {

    public void sendConfirmation(String userId, String orderId) {
        System.out.println("发送确认通知: 用户" + userId + " 订单" + orderId);
    }

}

/**
 * 支付子系统
 */
public class PaymentService {

    public boolean processPayment(String userId, double amount) {
        System.out.println("处理支付: 用户" + userId + " 金额" + amount);
        return true;
    }
    
}

/**
 * 物流子系统
 */
public class ShippingService {

    public String scheduleDelivery(String orderId) {
        String trackingNo = "TRK" + System.currentTimeMillis();
        System.out.println("安排配送: 订单" + orderId + " 物流单号" + trackingNo);
        return trackingNo;
    }

}

定义外观门面

复制代码
/**
 * 外观:订单处理门面
 */
public class OrderProcessFacade {

    private InventoryService inventory;

    private PaymentService payment;

    private ShippingService shipping;

    private NotificationService notification;

    public OrderProcessFacade() {
        this.inventory = new InventoryService();
        this.payment = new PaymentService();
        this.shipping = new ShippingService();
        this.notification = new NotificationService();
    }

    // 统一订单处理接口
    public String placeOrder(String userId, String productId, int quantity, double amount) {
        System.out.println("\n开始处理订单...");

        if (!inventory.checkStock(productId, quantity)) {
            throw new RuntimeException("库存不足");
        }

        inventory.lockStock(productId, quantity);

        if (!payment.processPayment(userId, amount)) {
            throw new RuntimeException("支付失败");
        }

        String orderId = "ORD" + System.currentTimeMillis();
        String trackingNo = shipping.scheduleDelivery(orderId);
        notification.sendConfirmation(userId, orderId);

        System.out.println("订单处理完成: " + orderId);
        return orderId;
    }

}

测试

复制代码
public class OrderController {

    public static void main(String[] args) {
        OrderProcessFacade orderFacade = new OrderProcessFacade();
        String orderId = orderFacade.placeOrder("user123", "prod1001", 2, 299.99);
        System.out.println("生成的订单号: " + orderId);
    }

}
相关推荐
拆房老料7 分钟前
DeepSeek Super-agent 架构解析:从单任务 Agent 到持续运行的任务系统
人工智能·设计模式·系统架构
代码山河34 分钟前
基本类型转换:自动类型转换与强制类型转换
java·学习·架构·教程·面向对象·项目
Escalating_xu2 小时前
【Linux 网络编程】五种 I/O 模型与非阻塞 I/O:从“等数据”到正确处理 EAGAIN
java·linux·网络
程序猿乐锅2 小时前
万字详解Single-flight(单飞模式)
java·开发语言·分布式·后端·学习·single-flight
Java后端的Ai之路2 小时前
【AIAgent开发】-Agent工具封装成CLI(纯干货!!!)
java·javascript·人工智能·agent·cli
AntsData3 小时前
用 12K+ 条亚马逊评论信号,定位机械键盘下一版该改什么
java·大数据·计算机外设
code2cat3 小时前
【随笔】连续批处理:长短请求怎样在迭代之间补位
java·人工智能·后端·大语言模型·vllm
最强小杰3 小时前
DeepSeek V4 Flash + Codex CLI 接入教程:原生 Responses API 适配,从配置到跑通收藏这篇就够了(2026)
java·前端·python·ai
Flynn Liang3 小时前
Spring AI 2.0 深度解析:ChatClient、Advisor 链与 MCP——Java 工程师的 AI 落地最优解
java·人工智能·spring·大模型·架构设计·spring ai
灿飞3 小时前
Kotlin与Java虚拟机六:基础与类型系统:一切皆对象,但对象有代价
java·kotlin