📜  策略模式 |第一套(介绍)(1)

📅  最后修改于: 2023-12-03 15:27:25.322000             🧑  作者: Mango

策略模式 |第一套(介绍)

简介

策略模式(Strategy Pattern)是一种行为设计模式,它使得能够在运行时切换算法簇,这些算法簇表现出同样的行为。

策略模式是一种对象行为型模式。在策略模式中,一个对象包含有多个行为(算法),在运行时可以根据需要选择相应的行为。

应用场景

策略模式适用于以下情况:

  • 多个相关的类仅仅是行为有异。
  • 需要使用一个算法的不同变体。
  • 算法使用客户端不应该知道的数据。
  • 一个类定义了多种行为,并且这些行为以多个条件语句的形式出现。
角色分析
  • 抽象策略(Strategy):定义了所有支持的算法的公共接口。所有的具体策略都需要实现这个接口。
  • 具体策略(ConcreteStrategy):具体的算法实现。
  • 环境(Context):维护一个对抽象策略类的引用,可以定义一个配置策略的方法,用于传入具体的策略。
示例代码
// 抽象策略
public interface DiscountStrategy {
    double calculateDiscount(double price);
}

// 具体策略
public class StudentDiscount implements DiscountStrategy {
    @Override
    public double calculateDiscount(double price) {
        return price * 0.8;
    }
}

// 具体策略
public class VIPDiscount implements DiscountStrategy {
    @Override
    public double calculateDiscount(double price) {
        return price * 0.5;
    }
}

// 环境
public class DiscountContext {
    private DiscountStrategy discountStrategy;

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

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

// 客户端
public class Client {
    public static void main(String[] args) {
        DiscountContext discountContext = new DiscountContext();
        DiscountStrategy studentDiscount = new StudentDiscount();
        DiscountStrategy vipDiscount = new VIPDiscount();

        discountContext.setDiscountStrategy(studentDiscount);
        System.out.println(discountContext.calculate(100)); // 80.0

        discountContext.setDiscountStrategy(vipDiscount);
        System.out.println(discountContext.calculate(100)); // 50.0
    }
}
总结

策略模式将算法的实现与使用分离开来,使得实现算法的每个类都具有很好的灵活性和可扩展性。同时,策略模式使得增加新的算法变得方便简单。