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 实现的代码示例:

java 复制代码
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

(一)定义策略接口

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

java 复制代码
public interface DiscountStrategy {
    double calculateDiscount(double originalPrice);
}

(二)实现具体策略

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

java 复制代码
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 折
    }
}

(三)策略上下文

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

java 复制代码
public class DiscountContext {
    private DiscountStrategy strategy;

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

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

(四)客户端代码

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

java 复制代码
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 和策略模式,可以有效地应对复杂的业务逻辑,提高代码的质量和可维护性。

相关推荐
欧哈东哥9 分钟前
【C++】标准库中用于组合多个值的数据结构pair、tuple、array...
java·数据结构·c++
python_13613 分钟前
web请求和响应
java·spring·github
柏油30 分钟前
可视化 MySQL binlog 监听方案
数据库·后端·mysql
舒一笑44 分钟前
Started TttttApplication in 0.257 seconds (没有 Web 依赖导致 JVM 正常退出)
jvm·spring boot·后端
张柏慈44 分钟前
JavaScript性能优化30招
开发语言·javascript·性能优化
M1A11 小时前
Java Enum 类:优雅的常量定义与管理方式(深度解析)
后端
Zyy~1 小时前
《设计模式》代理模式
设计模式·代理模式
AAA修煤气灶刘哥2 小时前
别再懵了!Spring、Spring Boot、Spring MVC 的区别,一篇讲透
后端·面试
ciku2 小时前
Spring AI Starter和文档解读
java·人工智能·spring