Java设计模式—策略模式(Strategy Mode)

前言:在策略模式,我们通过定义一系列算法类,将每个算法封装到具有共同接口抽象类中,使得它们之间可以相互的替换;

文章目录:

  1. 简介
  2. 概念
  3. 作用
  4. 优、缺点
  5. 应用场景
  6. 代码案例

一、策略模式的简介

策略模式(Strategy Mode)是一种行为型设计模式,它定义了算法家族,分别的封装起来,让它们之间可以相互替换;此模式让算法的变化,不会影响到使用算法的客户;这样做的好处是,当我们需要增加新的算法时,只需要添加一个新的算法类即可,而不需要修改原有的代码。

二、策略模式的概念

它定义了算法家族,分别封装起来,让它们之间可以相互替换。

三、策略模式的作用

策略模式的主要作用就是将算法的实现和客户端使用算法分离开来,使得算法变化而不影响客户端的代码;

策略模式的作用有以下几个方面:

  • 通过定义一系列算法类并封装到具有共同接口的抽象类中,我们可以在不修改原有代码的情况下轻松地切换算法,从而满足不同的业务需求;
  • 在没有使用策略模式的情况下,往往需要使用大量的条件语句来实现不同的业务逻辑,这样会使得代码变得复杂难以维护。而使用策略模式可以将不同的业务逻辑封装到不同的算法类中,从而避免了大量的条件语句;
  • 由于每个算法类都是独立的,因此可以在其他项目中重用这些算法类,从而提高代码的复用性;
  • 策略模式将算法的实现与使用算法的客户端代码分离开来,从而降低了它们之间的耦合度;

四、策略模式的优、缺点

策略模式的优点:

  • 可以方便地切换算法
  • 可以避免大量的条件语句
  • 可以提高代码的复用性
  • 可以降低耦合度

策略模式的缺点:

  • 策略模式的类过多:每次具体策略都要对应一个策略类,也就造成了类的数量增加,从而导致“类爆炸”;
  • 客户端必须了解所有的策略类:客户端使用策略类时,必须知道这个策略类的作用;
  • 策略模式的对象数量过多:每个策略类都是一个对象,当系统中存在大量的策略类时,会增加对象的数量,从而占用更多的内存空间;

五、策略模式应用场景

策略模式应用场景包括以下几个

  • 多选一的时候
  • 游戏角色:魔法师、大剑士、武士等等
  • 算法:加减乘除什么的
  • 还有一些就不一一写出来了

六、代码案例

注意:这里以商场打折、满减等为案例

1)抽象接口类

// 抽象策略类
public interface DiscountStrategy {
    double calculateDiscount(double price);
}

2)具体的策略类:减

// 具体策略类:满减
public class FullReduction implements DiscountStrategy {
    public double calculateDiscount(double price) {
        if (price >= 100) {
            return price - 20;
        }
        return price;
    }
}

3)具体策略类:打折

// 具体策略类:打折
public class Discount implements DiscountStrategy {
    public double calculateDiscount(double price) {
        return price * 0.8;
    }
}

4)上下文类


// 上下文类
public class Context {
    private DiscountStrategy discountStrategy;

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

    public double calculatePrice(double price) {
        return discountStrategy.calculateDiscount(price);
    }
}

5)客户端Main代码测试


// 客户端代码
public class StrategyPatternDemo {
    public static void main(String[] args) {
        Context context = new Context();
        
        // 使用满减策略
        context.setDiscountStrategy(new FullReduction());
        System.out.println("使用满减策略,总价为:" + context.calculatePrice(120));
        
        // 使用打折策略
        context.setDiscountStrategy(new Discount());
        System.out.println("使用打折策略,总价为:" + context.calculatePrice(120));
    }
}

测试结果:

使用满减策略,总价为:100.0

使用打折策略,总价为:96.0

总结:

策略模式是一种非常灵活和可扩展的设计模式,可以帮助我们更好地应对需求变化和提高代码质量

你可能感兴趣的:(策略模式,java,设计模式)