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