外观模式(Facade Pattern):微服务架构中的数据库访问实战案例分析

image.png

在电商平台中,支付流程通常涉及多个步骤,包括订单验证、支付处理、库存检查、日志记录等。为了简化支付流程的复杂性,我们使用外观模式来提供一个统一的支付接口。

肖哥弹架构 跟大家“弹弹” 设计模式,需要代码关注

欢迎 点赞,点赞,点赞。

关注公号Solomon肖哥弹架构获取更多精彩内容

2. 为什么要使用外观设计模式

外观模式允许我们将复杂的子系统交互封装在一个统一的接口后面,使得外部调用者无需了解内部的复杂逻辑。

3. 标准外观设计模式图

image.png

4. 业务外观设计模式图

image.png

5. 业务代码参考

// 订单类
class Order {
    private int orderId;
    private double amount;
    // 构造函数、getter 和 setter
}

// 支付结果类
class PaymentResult {
    private boolean success;
    private String message;
    // 构造函数、getter 和 setter
}

// 订单验证服务
class OrderValidationService {
    public boolean validateOrderDetails(Order order) {
        // 验证订单详细信息,例如订单ID和金额
        return true;
    }
}

// 支付网关服务
class PaymentGatewayService {
    public PaymentStatus makePayment(Order order) {
        // 调用支付网关处理支付
        return new PaymentStatus(true, "Payment processed successfully");
    }
}

// 库存检查服务
class StockCheckService {
    public boolean ensureSufficientInventory(Order order) {
        // 检查库存是否充足
        return true;
    }
}

// 事件记录服务
class EventLoggerService {
    public void logPaymentEvent(Order order, String status) {
        // 记录支付事件
    }
}

// 支付外观类
class PaymentFacade {
    private OrderValidationService orderValidationService;
    private PaymentGatewayService paymentGatewayService;
    private StockCheckService stockCheckService;
    private EventLoggerService eventLoggerService;

    public PaymentFacade() {
        orderValidationService = new OrderValidationService();
        paymentGatewayService = new PaymentGatewayService();
        stockCheckService = new StockCheckService();
        eventLoggerService = new EventLoggerService();
    }

    public PaymentResult initiatePayment(Order order) {
        if (!orderValidationService.validateOrderDetails(order)) {
            return new PaymentResult(false, "Order validation failed");
        }
        if (!stockCheckService.ensureSufficientInventory(order)) {
            return new PaymentResult(false, "Insufficient inventory");
        }
        PaymentStatus paymentStatus = paymentGatewayService.makePayment(order);
        if (paymentStatus.isPaymentSuccess()) {
            eventLoggerService.logPaymentEvent(order, "Success");
            return new PaymentResult(true, "Payment successful");
        } else {
            eventLoggerService.logPaymentEvent(order, "Failure");
            return new PaymentResult(false, "Payment failed");
        }
    }
}

// 支付状态枚举
enum PaymentStatus {
    SUCCESS("Success"), FAILURE("Failure");
    private String status;
    PaymentStatus(String status) { this.status = status; }
    public boolean isPaymentSuccess() { return this == SUCCESS; }
    public String getStatus() { return status; }
}

// 客户端使用
class ECommerceApplication {
    public static void main(String[] args) {
        Order order = new Order(); // 初始化订单
        PaymentFacade paymentFacade = new PaymentFacade();
        PaymentResult result = paymentFacade.initiatePayment(order);
        // 处理支付结果
    }
}

6. 使用外观设计模式的好处

外观模式解决了以下问题:

  • 简化复杂流程:支付流程涉及多个步骤,外观模式提供了一个简化的接口。
  • 解耦调用者和子系统:调用者无需了解子系统的内部实现。
  • 集中控制:便于集中管理和维护复杂的业务逻辑。

7. 其他使用外观设计模式场景参考

外观模式适用于需要简化复杂子系统访问的场景,例如:

  • 企业资源规划(ERP)系统:提供统一的业务流程接口。
  • 大型软件应用:如操作系统或开发环境,提供简化的用户界面。

8. 可参考开源框架

  • Spring Data:Spring Data JPA 通过 Repository 接口提供了数据库访问的外观模式。
  • Spring Framework:Spring 的 JdbcTemplate 就是一个外观模式的例子,它简化了数据库操作。

总结

外观模式通过提供一个统一的接口来简化对复杂子系统的访问,有助于降低系统间的耦合度,提高系统的可维护性和可扩展性。

历史热点文章

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,539评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,594评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,871评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,963评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,984评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,763评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,468评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,850评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,002评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,144评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,823评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,483评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,026评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,150评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,415评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,092评论 2 355

推荐阅读更多精彩内容