Java的策略模式用代码怎么实现

发布时间:2022-03-17 17:16:01 作者:iii
来源:亿速云 阅读:215

Java的策略模式用代码怎么实现

1. 策略模式简介

策略模式(Strategy Pattern)是一种行为设计模式,它允许在运行时选择算法的行为。策略模式定义了一系列算法,并将每个算法封装起来,使它们可以互换。策略模式使得算法可以独立于使用它的客户端而变化。

策略模式的主要优点包括: - 算法可以自由切换 - 避免使用多重条件判断 - 扩展性良好

策略模式的主要角色包括: - Context(环境类):持有一个策略类的引用,最终给客户端调用。 - Strategy(抽象策略类):定义了一个公共接口,各种不同的算法以不同的方式实现这个接口。 - ConcreteStrategy(具体策略类):实现了抽象策略定义的接口,提供具体的算法实现。

2. 策略模式的实现步骤

在Java中实现策略模式通常包括以下步骤:

  1. 定义一个策略接口(Strategy),该接口声明了所有支持的算法的公共方法。
  2. 创建具体的策略类(ConcreteStrategy),每个类实现策略接口并提供具体的算法实现。
  3. 创建环境类(Context),该类持有一个策略对象的引用,并提供一个方法来执行策略。
  4. 客户端代码通过环境类来选择和使用具体的策略。

3. 策略模式的代码实现

下面通过一个简单的例子来演示如何在Java中实现策略模式。假设我们有一个电商系统,需要根据不同的促销策略来计算商品的最终价格。

3.1 定义策略接口

首先,我们定义一个策略接口 PricingStrategy,该接口声明了一个计算价格的方法 calculatePrice

public interface PricingStrategy {
    double calculatePrice(double originalPrice);
}

3.2 创建具体策略类

接下来,我们创建几个具体的策略类,每个类实现 PricingStrategy 接口并提供不同的价格计算算法。

3.2.1 无折扣策略

public class NoDiscountStrategy implements PricingStrategy {
    @Override
    public double calculatePrice(double originalPrice) {
        return originalPrice;
    }
}

3.2.2 固定折扣策略

public class FixedDiscountStrategy implements PricingStrategy {
    private double discountAmount;

    public FixedDiscountStrategy(double discountAmount) {
        this.discountAmount = discountAmount;
    }

    @Override
    public double calculatePrice(double originalPrice) {
        return originalPrice - discountAmount;
    }
}

3.2.3 百分比折扣策略

public class PercentageDiscountStrategy implements PricingStrategy {
    private double discountPercentage;

    public PercentageDiscountStrategy(double discountPercentage) {
        this.discountPercentage = discountPercentage;
    }

    @Override
    public double calculatePrice(double originalPrice) {
        return originalPrice * (1 - discountPercentage / 100);
    }
}

3.3 创建环境类

然后,我们创建一个环境类 PricingContext,该类持有一个 PricingStrategy 对象的引用,并提供一个方法来执行策略。

public class PricingContext {
    private PricingStrategy pricingStrategy;

    public PricingContext(PricingStrategy pricingStrategy) {
        this.pricingStrategy = pricingStrategy;
    }

    public void setPricingStrategy(PricingStrategy pricingStrategy) {
        this.pricingStrategy = pricingStrategy;
    }

    public double executeStrategy(double originalPrice) {
        return pricingStrategy.calculatePrice(originalPrice);
    }
}

3.4 客户端代码

最后,我们编写客户端代码来使用策略模式。客户端代码可以根据需要选择不同的策略来计算商品的价格。

public class StrategyPatternDemo {
    public static void main(String[] args) {
        double originalPrice = 100.0;

        // 使用无折扣策略
        PricingContext context = new PricingContext(new NoDiscountStrategy());
        System.out.println("Original Price: " + originalPrice);
        System.out.println("Final Price with No Discount: " + context.executeStrategy(originalPrice));

        // 切换到固定折扣策略
        context.setPricingStrategy(new FixedDiscountStrategy(20.0));
        System.out.println("Final Price with Fixed Discount: " + context.executeStrategy(originalPrice));

        // 切换到百分比折扣策略
        context.setPricingStrategy(new PercentageDiscountStrategy(10.0));
        System.out.println("Final Price with Percentage Discount: " + context.executeStrategy(originalPrice));
    }
}

3.5 运行结果

运行上述代码,输出结果如下:

Original Price: 100.0
Final Price with No Discount: 100.0
Final Price with Fixed Discount: 80.0
Final Price with Percentage Discount: 90.0

4. 策略模式的优缺点

4.1 优点

  1. 算法可以自由切换:策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类里面,从而避免代码重复。
  2. 避免使用多重条件判断:使用策略模式可以避免使用多重条件判断语句。多重条件判断语句不易维护,它把采取哪一种算法或行为的逻辑与算法或行为的实现混合在一起,统统列在一个多重条件判断语句里面,比使用继承的办法还要原始和落后。
  3. 扩展性良好:策略模式提供了对“开闭原则”的完美支持,用户可以在不修改原有系统的基础上选择算法或行为,也可以灵活地增加新的算法或行为。

4.2 缺点

  1. 客户端必须知道所有的策略类:客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。
  2. 策略模式将造成产生很多策略类:可以通过使用享元模式在一定程度上减少对象的数量。

5. 策略模式的应用场景

策略模式在以下场景中非常有用:

  1. 多种算法或行为:如果一个系统有许多类,而它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
  2. 需要动态切换算法:如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
  3. 算法的封装:不希望客户端知道复杂的、与算法相关的数据结构,策略模式可以将算法的使用与算法的实现分离开来。

6. 总结

策略模式是一种非常实用的设计模式,它通过将算法封装在独立的策略类中,使得算法可以独立于使用它的客户端而变化。策略模式不仅提高了代码的灵活性和可维护性,还使得系统更容易扩展。在实际开发中,策略模式可以广泛应用于需要动态切换算法或行为的场景中。

通过本文的示例代码,我们可以看到策略模式在Java中的实现非常简单且直观。希望本文能帮助你更好地理解策略模式,并在实际项目中灵活运用。

推荐阅读:
  1. javascript策略模式的实现
  2. Java怎么利用策略模式优化过多if else代码

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:python字典常用的方法有哪些

下一篇:C#队列如何使用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》