👨🎓 模式名称:外观模式(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;
}