c语言编程笔录

首页 >   > 笔记大全

笔记大全

Java怎么优雅的使用策略模式

更新时间:2023-10-10

什么是策略模式?

策略模式是一种常用的设计模式,它定义了一系列算法,并将每个算法封装起来,从而使它们可以互换。策略模式使得算法可以独立于使用它们的客户端而变化。这意味着客户端可以通过选择不同的算法来达到不同的目的,而不必改变代码。

策略模式的使用场景

策略模式适用于需要在运行时动态地更改算法时。例如,当我们需要解决一个问题,而不确定要使用哪种算法时,我们可以使用策略模式轻松地在这些算法之间进行切换。

另外,策略模式还可以避免使用多个条件分支(if-else语句)来控制程序流程,如果不使用策略模式,代码可能会变得冗长和难以维护。

示例代码

以下是一个简单的Java示例,展示了如何使用策略模式。我们将实现一个简单的电商网站,显示同一种商品的不同价格,以展示不同的优惠策略。

我们首先需要定义一个抽象策略类,以便我们可以定义算法所需的方法:

public abstract class DiscountStrategy {
    public abstract double applyDiscount(double price);
}

接下来,我们定义几个具体的策略类,每个类表示不同的算法:

public class NoDiscountStrategy extends DiscountStrategy {
    public double applyDiscount(double price) {
        return price;
    }
}

public class BlackFridayDiscountStrategy extends DiscountStrategy {
    public double applyDiscount(double price) {
        return price * 0.75; 
    }
}

public class ChristmasDiscountStrategy extends DiscountStrategy {
    public double applyDiscount(double price) {
        return price * 0.6;
    }
}

在这个示例中,我们定义了三个具体的策略类,它们分别代表不打折、黑色星期五和圣诞节。在每个策略类中,我们实现了applyDiscount方法,这个方法接收一个价格作为输入,并返回一个优惠后的价格。

接下来,我们需要定义一个上下文类,它用于选择算法:

public class PriceContext {
    private DiscountStrategy discountStrategy;

    public PriceContext(DiscountStrategy discountStrategy) {
        this.discountStrategy = discountStrategy;
    }

    public void setDiscountStrategy(DiscountStrategy discountStrategy) {
        this.discountStrategy = discountStrategy;
    }

    public double applyDiscount(double price) {
        return discountStrategy.applyDiscount(price);
    }
}

在这个类中,我们使用了一个DiscountStrategy对象来存储当前使用的算法。在构造函数中,我们传入一个DiscountStrategy对象,并将其赋值给一个实例变量。我们还提供了一个setDiscountStrategy方法,用于更改当前使用的算法。最后,我们提供一个applyDiscount方法,该方法接收一个价格作为输入,并返回一个优惠后的价格,使用当前算法。

以下是一个简单的示例,展示了如何使用上下文对象来选择算法:

public static void main(String[] args) {
    PriceContext context = new PriceContext(new NoDiscountStrategy());

    double price = 100.0;
    System.out.println("Price without discount: " + price);

    context.setDiscountStrategy(new BlackFridayDiscountStrategy());
    double priceAfterDiscount = context.applyDiscount(price);
    System.out.println("Price after Black Friday discount: " + priceAfterDiscount);

    context.setDiscountStrategy(new ChristmasDiscountStrategy());
    priceAfterDiscount = context.applyDiscount(price);
    System.out.println("Price after Christmas discount: " + priceAfterDiscount);
}

在这个示例中,我们创建了一个PriceContext对象,并使用NoDiscountStrategy作为默认算法。我们计算出原始价格,并分别使用BlackFridayDiscountStrategy和ChristmasDiscountStrategy算法来计算价格。

总结

策略模式是一种灵活的设计模式,它允许我们在运行时动态地更改算法。通过使用策略模式,我们可以轻松地实现多个算法之间的切换,而不必改变代码。在实现策略模式时,我们定义一个抽象策略类和一些具体策略类,并将它们封装在上下文类中。上下文类用于选择算法,并将工作委托给所选算法的对象。使用策略模式可以使代码更加清晰和易于维护。

返回到HTML格式的内容