C++ 设计模式 《外卖高峰期,小明靠一键下单系统拯救了万千饥饿学子》

👨‍🎓 模式名称:外观模式(Facade Pattern)

🧵 故事背景

“小明的万能校园生活服务平台”已经火遍整个大学城🍜,尤其是午饭时间,订单量暴增,连服务器都开始喘气!
但小明发现,许多用户吐槽:

“我只是想点个饭,为什么要选配送、支付、优惠券这么多步骤?太烦了!”
“我女朋友下单慢了几秒,就没奶茶了,我要分手了😭”

于是,小明决定:做个**“一键下单”功能**!点一下按钮,订单、支付、物流一条龙全自动搞定!💥

这就用到了:外观模式!

🧱 没使用外观模式:客户端耦合多个子系统,调用逻辑乱七八糟

OrderSystem orderSystem;
orderSystem.createOrder("小明", "奶茶一杯");

PaymentSystem paymentSystem;
paymentSystem.bindCard("小明", "123456");
paymentSystem.pay(18.0);

LogisticsSystem logisticsSystem;
logisticsSystem.pickup();
logisticsSystem.deliver("小明");

⚠️ 每次下单都要亲自操作三个子系统。重复代码多,维护困难,用户容易误操作。

🌟 使用外观模式:一键下单,丝滑无比!

🧩 各子系统组件(保留原样)
// 订单系统
class OrderSystem {
public:
    void createOrder(const std::string& user, const std::string& item) {
        std::cout << "创建订单:" << user << " 要了 " << item << std::endl;
    }
};

// 支付系统
class PaymentSystem {
public:
    void bindCard(const std::string& user, const std::string& card) {
        std::cout << "绑定用户 " << user << " 的支付卡:" << card << std::endl;
    }

    void pay(double amount) {
        std::cout << "支付金额:" << amount << " 元" << std::endl;
    }
};

// 物流系统
class LogisticsSystem {
public:
    void pickup() {
        std::cout << "配送员已取货" << std::endl;
    }

    void deliver(const std::string& user) {
        std::cout << "配送中:送给 " << user << std::endl;
    }
};

🧙‍♂️ 外观类:一键下单接口

class OneClickOrderFacade {
    OrderSystem order;
    PaymentSystem payment;
    LogisticsSystem logistics;

public:
    void oneClickBuy(const std::string& user, const std::string& item, double price) {
        std::cout << "\n 开始一键下单流程 " << std::endl;

        order.createOrder(user, item);
        payment.bindCard(user, "校园一卡通");
        payment.pay(price);
        logistics.pickup();
        logistics.deliver(user);

        std::cout << "一键下单完成,坐等送达!\n" << std::endl;
    }
};

🧪 测试代码

int main() {
    OneClickOrderFacade orderFacade;

    // 用户调用简单接口,无需了解子系统
    orderFacade.oneClickBuy("小明", "烧烤套餐", 28.0);
    orderFacade.oneClickBuy("小红", "奶茶一杯", 16.0);

    return 0;
}

🧠 对比总结

特性没有外观模式使用外观模式
用户代码耦合性高必须了解每个子系统的细节和调用顺序隐藏子系统实现,仅暴露统一接口
代码复用性重复调用多个系统封装逻辑,集中维护
用户体验需要多步操作,容易出错一键下单,体验丝滑顺畅 🛫
开发与维护成本每个地方都要处理子系统调用改变子系统不影响调用方

🧰 外观模式适用场景

  • 客户端需要一个简单接口调用复杂子系统

  • 隐藏底层实现、降低系统耦合

  • 在开发 SDK、模块封装、简化流程接口中常见

✅ 项目中典型应用示例

子系统用途
订单系统创建并管理订单
支付系统处理支付逻辑
优惠券系统计算和应用优惠
物流系统配送流程管理

📦 UML 类图结构

      OneClickOrderFacade
       /          |      \
OrderSystem PaymentSystem LogisticsSystem

完整例子

#include <iostream>

// 订单系统
class OrderSystem {
public:
    void createOrder(const std::string& user, const std::string& item) {
        std::cout << "创建订单:" << user << " 要了 " << item << std::endl;
    }
};

// 支付系统
class PaymentSystem {
public:
    void bindCard(const std::string& user, const std::string& card) {
        std::cout << "绑定用户 " << user << " 的支付卡:" << card << std::endl;
    }

    void pay(double amount) {
        std::cout << "支付金额:" << amount << " 元" << std::endl;
    }
};

// 物流系统
class LogisticsSystem {
public:
    void pickup() {
        std::cout << "配送员已取货" << std::endl;
    }

    void deliver(const std::string& user) {
        std::cout << "配送中:送给 " << user << std::endl;
    }
};

class OneClickOrderFacade {
    OrderSystem order;
    PaymentSystem payment;
    LogisticsSystem logistics;

public:
    void oneClickBuy(const std::string& user, const std::string& item, double price) {
        std::cout << "开始一键下单流程" << std::endl;

        order.createOrder(user, item);
        payment.bindCard(user, "校园一卡通");
        payment.pay(price);
        logistics.pickup();
        logistics.deliver(user);

        std::cout << "一键下单完成,坐等送达!\n" << std::endl;
    }
};

int main() {
    OneClickOrderFacade orderFacade;

    // 用户调用简单接口,无需了解子系统
    orderFacade.oneClickBuy("小明", "烧烤套餐", 28.0);
    orderFacade.oneClickBuy("小红", "奶茶一杯", 16.0);

    return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值