4.外观模式
外观模式(Facade Pattern)的主要目的是:把多步骤流程封装成一个入口,让调用方不需要关心内部细节,直接通过外观对象完成业务操作,从而降低调用复杂度和耦合度
适合使用外观模式的场景
- 下单流程:把库存校验、价格计算、优惠券、支付、通知进行封装
- 文件上传:把分片、重试、秒传、进度、合并、回调等功能进行封装
子系统定义
interface SubmitOrderParams {
orderId: string;
skuId: string;
count: number;
amount: number;
userId: string;
}
class InventoryService {
check(skuId: string, count: number): boolean {
console.log("检查库存", skuId, count);
return true;
}
}
class PaymentService {
pay(orderId: string, amount: number): boolean {
console.log("支付成功", orderId, amount);
return true;
}
}
class NotifyService {
send(userId: string, message: string): void {
console.log("发送通知", userId, message);
}
}外观类
class OrderFacade {
constructor(
private inventory = new InventoryService(),
private payment = new PaymentService(),
private notify = new NotifyService(),
) {}
submit(params: SubmitOrderParams): void {
const inStock = this.inventory.check(params.skuId, params.count);
if (!inStock) {
throw new Error("库存不足");
}
const paid = this.payment.pay(params.orderId, params.amount);
if (!paid) {
throw new Error("支付失败");
}
this.notify.send(params.userId, "下单成功");
}
}使用示例
new OrderFacade().submit({
orderId: "O-1001",
skuId: "SKU-1",
count: 1,
amount: 99,
userId: "U-1",
});在这个案例中把 inventory.check、payment.pay、notify.send 收敛成一步 orderFacade.submit
