当前位置: 首页 > article >正文

JAVA DDD设计模式:用策略模式干掉满屏if-else

在软件开发中,if-else 语句是常见的控制流结构,但当业务逻辑变得复杂时,满屏的 if-else 会让代码变得难以维护和扩展。领域驱动设计(DDD)强调通过领域模型来表达业务逻辑,而设计模式中的策略模式(Strategy Pattern)则是消除 if-else 的利器。本文将结合 DDD 和策略模式,展示如何用策略模式干掉满屏的 if-else,并提供具体的代码示例。

一、DDD 与策略模式概述

(一)领域驱动设计(DDD)

领域驱动设计(Domain-Driven Design,简称 DDD)是一种软件开发方法论,旨在应对复杂业务领域的软件系统构建挑战。它强调以领域模型为核心,围绕业务领域中的关键概念、规则以及它们之间的关系来组织软件架构与设计,使软件系统能够更紧密地贴合业务需求,提高可维护性、可扩展性与可理解性。

(二)策略模式

策略模式是一种行为型设计模式,它定义了一系列算法,并将每个算法封装到独立的类中,使它们可以互换使用。策略模式的核心思想是将算法的选择和执行分离,从而避免了大量的 if-else 语句。

二、问题场景:满屏的 if-else

假设我们有一个电商平台,需要根据不同的用户类型(普通用户、会员、VIP 会员)计算不同的折扣。以下是使用 if-else 实现的代码示例:

public class DiscountCalculator {
    public double calculateDiscount(User user, double originalPrice) {
        if (user.getType().equals("普通用户")) {
            return originalPrice * 0.9; // 9 折
        } else if (user.getType().equals("会员")) {
            return originalPrice * 0.8; // 8 折
        } else if (user.getType().equals("VIP 会员")) {
            return originalPrice * 0.7; // 7 折
        } else {
            return originalPrice; // 无折扣
        }
    }
}

随着业务的发展,用户类型和折扣规则可能会不断增加,代码中的 if-else 语句也会越来越多,导致代码难以维护和扩展。

三、用策略模式消除 if-else

(一)定义策略接口

首先,我们定义一个折扣策略接口,将不同的折扣规则封装为独立的策略。

public interface DiscountStrategy {
    double calculateDiscount(double originalPrice);
}

(二)实现具体策略

为每种用户类型实现具体的折扣策略。

public class OrdinaryUserDiscountStrategy implements DiscountStrategy {
    @Override
    public double calculateDiscount(double originalPrice) {
        return originalPrice * 0.9; // 9 折
    }
}

public class MemberDiscountStrategy implements DiscountStrategy {
    @Override
    public double calculateDiscount(double originalPrice) {
        return originalPrice * 0.8; // 8 折
    }
}

public class VipMemberDiscountStrategy implements DiscountStrategy {
    @Override
    public double calculateDiscount(double originalPrice) {
        return originalPrice * 0.7; // 7 折
    }
}

(三)策略上下文

创建一个策略上下文类,用于管理具体的策略。

public class DiscountContext {
    private DiscountStrategy strategy;

    public DiscountContext(DiscountStrategy strategy) {
        this.strategy = strategy;
    }

    public double calculateDiscount(double originalPrice) {
        return strategy.calculateDiscount(originalPrice);
    }
}

(四)客户端代码

在客户端代码中,根据用户类型选择相应的策略。

public class Main {
    public static void main(String[] args) {
        User user = new User("张三", "会员");
        double originalPrice = 100.0;

        DiscountStrategy strategy = getDiscountStrategy(user.getType());
        DiscountContext context = new DiscountContext(strategy);
        double discountedPrice = context.calculateDiscount(originalPrice);

        System.out.println("折扣后的价格:" + discountedPrice);
    }

    private static DiscountStrategy getDiscountStrategy(String userType) {
        if (userType.equals("普通用户")) {
            return new OrdinaryUserDiscountStrategy();
        } else if (userType.equals("会员")) {
            return new MemberDiscountStrategy();
        } else if (userType.equals("VIP 会员")) {
            return new VipMemberDiscountStrategy();
        } else {
            return new NoDiscountStrategy(); // 无折扣策略
        }
    }
}

通过这种方式,我们将具体的折扣规则封装在独立的策略类中,避免了大量的 if-else 语句。当需要添加新的用户类型或折扣规则时,只需新增一个策略类,而无需修改现有的代码,符合开闭原则。

四、总结

DDD 强调通过领域模型来表达业务逻辑,而策略模式则是消除 if-else 的有效工具。通过将不同的业务规则封装为独立的策略类,我们可以使代码更加清晰、可维护和可扩展。在实际开发中,结合 DDD 和策略模式,可以有效地应对复杂的业务逻辑,提高代码的质量和可维护性。


http://www.kler.cn/a/545294.html

相关文章:

  • 吉祥汽车泰国首发,用 Unity 实现行业首创全 3D 座舱虚拟世界
  • 【深度学习】计算机视觉(CV)-目标检测-SSD(Single Shot MultiBox Detector)—— 单次检测多框检测器
  • 了解卷积神经网络(Convolutional Neural Network,CNN)
  • React组件重新渲染机制
  • App UI自动化--Appium学习--第二篇
  • 【Elasticsearch】标准化器(Normalizers)
  • Excel文件的读取
  • 【工业场景】用YOLOv8实现火灾识别
  • Windows软件自动化利器:pywinauto python
  • python 大数据的优势
  • vscode插件Remote - SSH使用教程
  • postman登录cookie设置
  • 什么是HTTP Error 429以及如何修复
  • 19.4.9 数据库方式操作Excel
  • 2025 年 1 月区块链游戏研报:市场指标下滑,平台竞争加剧
  • 简单了解低代码Low Code
  • 最新消息 | 德思特荣获中国创新创业大赛暨广州科技创新创业大赛三等奖!
  • 【Antv G2 5.x】饼图添加点击事件,获取当前坐标数据
  • 旅游全域体验系统(源码+文档+部署+讲解)
  • 哈希表-两个数的交集