告别繁琐的`if-else`!七种方法让Spring Boot项目更简洁高效

科技   2024-10-20 08:00   河北  


前言

在Spring Boot项目中,面对大量的if-else语句,优化这些代码显得尤为重要,因为它们不仅提升了维护的复杂性,还可能削弱应用程序的可读性和性能。以下列出了七种具体策略,旨在Spring Boot项目中优化并重构这些if-else语句。

使用策略模式(Strategy Pattern)

具体的实现步骤如下:

  1. 定义策略接口:首先,需要创建一个策略接口,该接口内应包含所有可能执行的方法声明。

  2. 创建具体策略类:接着,针对原if-else语句中的每一个分支,分别创建一个具体的策略类,这些类要实现前面定义的策略接口,并在其中定义各自的具体行为。

  3. 策略选择与执行:最后,在程序运行时,根据具体的条件判断,动态地选择并执行相应的策略对象。


  4. interface OrderStrategy {
        void processOrder(Order order);
    }

    class NormalOrderStrategy implements OrderStrategy {
        @Override
        public void processOrder(Order order) {
            // 处理普通订单
        }
    }

    class VIPOrderStrategy implements OrderStrategy {
        @Override
        public void processOrder(Order order) {
            // 处理VIP订单
        }
    }

    // 在某个服务类中
    class OrderService {
        private Map<String, OrderStrategy> strategies = new HashMap<>();

        public OrderService() {
            strategies.put("NORMAL", new NormalOrderStrategy());
            strategies.put("VIP", new VIPOrderStrategy());
        }

        public void processOrderByType(String type, Order order) {
            OrderStrategy strategy = strategies.getOrDefault(type, new DefaultOrderStrategy());
            strategy.processOrder(order);
        }}

使用命令模式

具体实现步骤细化如下:

  1. 定义命令接口:首先,设计一个命令接口,该接口中应声明一个执行命令的方法。

  2. 创建具体命令类:接着,针对原if-else语句的每一个分支,分别创建一个具体的命令类,这些类要实现前面定义的命令接口,并在内部封装各自独特的操作逻辑。

  3. 配置调用者:然后,构建一个调用者对象,它的职责是在程序运行时根据条件判断,选择并执行相应的命令对象。

枚举与策略模式结合 

枚举类与策略模式的结合可以简化策略的选择逻辑,并显著提升代码的可维护性和扩展性。

实战应用案例:订单状态管理
在这个案例中,我们利用枚举类来管理订单的各种状态,并通过结合策略模式来实现不同订单状态下的特定处理逻辑。

// 状态枚举
public enum OrderStatus {
    NEW, PROCESSING, COMPLETED, CANCELED;
}

// 状态策略接口
public interface OrderStatusStrategy {
    void handleOrder();
}

// 具体状态策略类
public class NewOrderStrategy implements OrderStatusStrategy {
    @Override
    public void handleOrder() {
        System.out.println("处理新订单");
    }
}

public class ProcessingOrderStrategy implements OrderStatusStrategy {
    @Override
    public void handleOrder() {
        System.out.println("处理处理中订单");
    }
}

// 状态上下文
public class OrderContext {
    private OrderStatusStrategy strategy;

    public OrderContext(OrderStatus status) {
        switch (status) {
            case NEW:
                strategy = new NewOrderStrategy();
                break;
            case PROCESSING:
                strategy = new ProcessingOrderStrategy();
                break;
            // 其他状态
        }
    }

    public void executeStrategy() {
        strategy.handleOrder();
    }
}

// 客户端代码
public class OrderClient {
    public static void main(String[] args) {
        OrderContext context = new OrderContext(OrderStatus.NEW);
        context.executeStrategy();
        
        context = new OrderContext(OrderStatus.PROCESSING);
        context.executeStrategy();
    }
}

使用状态模式(State Pattern)


具体实现步骤细化如下:

  1. 定义状态接口:首先,设计一个状态接口,该接口中应声明与对象状态相关的行为方法。

  2. 创建具体状态类:接着,针对每一个不同的状态,分别创建一个具体的状态类,这些类要实现前面定义的状态接口,并在其中定义该状态下对象应执行的具体行为。

  3. 实现上下文类:然后,构建一个上下文对象,该对象负责维护当前的状态对象,并提供一个方法来允许状态在运行时根据需要进行更改,同时它还可以触发状态对象的行为执行。


interface OrderState {
    void handle(OrderContext context);
}

class PendingState implements OrderState {
    @Override
    public void handle(OrderContext context) {
        // 处理待支付订单
        context.setState(new PaidState()); // 假设支付后状态改变
    }
}

class OrderContext {
    private OrderState state;

    public OrderContext() {
        this.state = new PendingState();
    }

    public void setState(OrderState state) {
        this.state = state;
    }

    public void handle() {
        state.handle(this);
    }
}

 多态性

利用多态性可以有效避免复杂的if-else语句,通过接口或基类提供的多态性来实现不同行为的具体执行。

实战应用案例:消息通知系统
在这个消息通知系统中,我们根据不同类型的通知(例如邮件、短信、应用内推送等)来选择并执行相应的通知方式,而这些不同类型的通知则是通过实现同一个接口或继承自同一个基类的不同类来实现的,从而充分利用了多态性的优势。

// 通知接口
public interface Notification {
    void send(String message);
}

// 具体通知类
public class EmailNotification implements Notification {
    @Override
    public void send(String message) {
        System.out.println("通过邮件发送通知: " + message);
    }
}

public class SMSNotification implements Notification {
    @Override
    public void send(String message) {
        System.out.println("通过短信发送通知: " + message);
    }
}

// 客户端代码
public class NotificationClient {
    public static void main(String[] args) {
        Notification emailNotification = new EmailNotification();
        emailNotification.send("您的订单已发货");
        
        Notification smsNotification = new SMSNotification();
        smsNotification.send("您的订单已发货");
    }
}

 Lambda 表达式与函数接口

Lambda 表达式与函数接口的结合可以简化代码结构,并提供一种更为简洁高效的方式来处理多种逻辑场景。

实战应用案例:折扣计算系统
在这个折扣计算系统中,我们利用Lambda表达式来替代冗长且复杂的if-else语句,从而实现对不同折扣规则的高效计算。

import java.util.function.Function;

// 折扣策略接口
@FunctionalInterface
public interface DiscountStrategy {
    double applyDiscount(double price);
}

// 客户端代码
public class DiscountClient {
    public static void main(String[] args) {
        Function<Double, Double> seasonalDiscount = price -> price * 0.9;
        Function<Double, Double> memberDiscount = price -> price * 0.85;
        
        double originalPrice = 100.0;
        double discountedPrice = seasonalDiscount.apply(originalPrice);
        System.out.println("季节折扣后的价格: " + discountedPrice);
        
        discountedPrice = memberDiscount.apply(originalPrice);
        System.out.println("会员折扣后的价格: " + discountedPrice);
    }}
模板方法模式(Template Method Pattern

具体实现步骤细化如下:

  1. 定义抽象基类:首先,需要构建一个抽象基类,该类中应包含一个或多个抽象方法(这些方法将在子类中实现),同时还应包含一个或多个模板方法(这些方法定义了算法的骨架,并在其中调用抽象方法)。

  2. 实现具体子类:接着,针对每一种具体的算法或行为,分别创建抽象基类的子类,并在这些子类中实现抽象基类中的抽象方法,以提供具体的行为实现。

  3. 执行模板方法:最后,在客户端代码中,通过创建具体子类的实例,并调用其模板方法来触发算法的执行。模板方法将按照定义的算法骨架调用相应的抽象方法,从而实现具体的算法逻辑。



abstract class AbstractClass {
    // 模板方法
    final void templateMethod() {
        operation1();
        if (someCondition()) {
            operation2();
        }
        operation3();
    }

    // 抽象方法,由子类实现
    abstract void operation1();

    abstract void operation3();

    // 钩子方法,子类可以选择重写
    boolean someCondition() {
        return true; // 默认行为
    }

    void operation2() {
        // 默认实现,子类可以选择覆盖
    }
}

class ConcreteClass extends AbstractClass {
    @Override
    void operation1() {
        // 实现
    }

    @Override
    void operation3() {
        // 实现
    }

    // 可以选择重写钩子方法以改变条件行为
}

// 使用时
ConcreteClass concrete = new ConcreteClass();
concrete.templateMethod();



Java技术前沿
专注分享Java技术,包括但不限于 SpringBoot,SpringCloud,Docker,消息中间件等。
 最新文章