返回

策略模式简析:明晰编码,以变应不变

前端

策略模式:明晰编码,以变应不变

在软件开发的旅程中,我们经常会遇到这样一个问题:系统中存在许多不同的条件语句,它们负责处理不同的情况。随着时间的推移,这些条件语句会变得越来越复杂,越来越难以维护。这时,策略模式便闪亮登场了。

策略模式,顾名思义,就是把不同的算法封装成独立的类,然后根据不同的情况选择不同的策略类来执行不同的算法。这样,我们就避免了使用多重条件语句,使代码更加清晰易懂,也更容易维护。

策略模式的优点显而易见:

  • 解耦算法与客户端代码: 策略模式将算法从客户端代码中分离出来,使客户端代码更加简洁,更容易理解和维护。
  • 提高代码可重用性: 策略模式允许我们重用现有的算法实现,从而减少重复代码。
  • 提高代码的可扩展性: 策略模式使我们能够轻松地添加新的算法,而无需修改现有代码。

举个例子来说,假设我们正在开发一个电商系统,需要根据不同的支付方式来计算不同的运费。我们使用策略模式可以将不同的运费计算方法封装成独立的类,然后根据用户的支付方式选择不同的策略类来计算运费。

interface ShippingStrategy {
    double calculateShippingCost(Order order);
}

class FreeShippingStrategy implements ShippingStrategy {
    @Override
    public double calculateShippingCost(Order order) {
        return 0;
    }
}

class StandardShippingStrategy implements ShippingStrategy {
    @Override
    public double calculateShippingCost(Order order) {
        return 5.99;
    }
}

class ExpressShippingStrategy implements ShippingStrategy {
    @Override
    public double calculateShippingCost(Order order) {
        return 9.99;
    }
}

class Order {
    private double amount;
    private ShippingStrategy shippingStrategy;

    public Order(double amount, ShippingStrategy shippingStrategy) {
        this.amount = amount;
        this.shippingStrategy = shippingStrategy;
    }

    public double calculateShippingCost() {
        return shippingStrategy.calculateShippingCost(this);
    }
}

public class Main {
    public static void main(String[] args) {
        Order order = new Order(100.0, new FreeShippingStrategy());
        System.out.println("Shipping cost: " + order.calculateShippingCost());

        order = new Order(100.0, new StandardShippingStrategy());
        System.out.println("Shipping cost: " + order.calculateShippingCost());

        order = new Order(100.0, new ExpressShippingStrategy());
        System.out.println("Shipping cost: " + order.calculateShippingCost());
    }
}

在上面的代码中,我们定义了一个接口ShippingStrategy,它定义了计算运费的方法calculateShippingCost()。然后,我们定义了三个实现ShippingStrategy接口的类:FreeShippingStrategyStandardShippingStrategyExpressShippingStrategy。这些类分别代表免费配送、标准配送和快速配送三种配送方式。

最后,我们在Order类中使用策略模式来计算运费。Order类有一个成员变量shippingStrategy,它代表所选择的配送方式。在计算运费时,Order类调用shippingStrategy对象的calculateShippingCost()方法来计算运费。

策略模式是一种非常灵活的设计模式,它可以用于解决各种各样的问题。如果您正在寻找一种方法来解耦算法与客户端代码、提高代码可重用性或提高代码的可扩展性,那么策略模式是一个很好的选择。