策略模式
策略模式(Strategy Pattern)属于行为设计模式,它定义了一系列算法,并将每一个算法封装起来,使它们可以相互替换。策略模式让算法的变化独立于使用算法的客户,从而使得算法可以在不影响到客户端的情况下发生变化。(策略模式封装了变化)
类图
主要角色
- 策略接口(Strategy Interface):定义所有支持的算法的公共接口。这是一个抽象类或接口,声明了具体策略类需要实现的方法。
- 具体策略类(Concrete Strategies):实现了策略接口,提供了具体的算法实现。
- 上下文(Context):持有一个策略接口的引用。上下文通常会包含一个设置具体策略的方法,允许在运行时切换策略。
适用场景
在不同时间应用不同的业务规则,可以使用考虑使用策略模式处理这种变化的可能性
多个相似行为的场景:当一个对象根据情况需要在多种算法或行为中选择一种来执行时。
行为或算法可互换的场景:算法的实现细节需要能够独立于使用它们的类进行变化或扩展。
避免使用多重条件判断:如果一个类中有大量if-else或switch-case语句用于选择算法,可以考虑使用策略模式来替代,以提高代码的清晰度和可维护性。
优点
简化了单元测试
封装了变化,策略模式使得算法的定义与使用分离,提高了系统的灵活性和可扩展性。
每种算法都被封装在单独的类中,方便复用。
易于理解和维护:通过将复杂的条件逻辑分散到各个策略类中,使得代码更加清晰和易于维护。
运行时可配置:可以在运行时选择不同的策略,增加了程序的灵活性
示例
java
public class ShopBasicTest {
public static void main(String[] args){
Context context;
//由于实例化不同的策略,所以最终在调用
//context.contextInterface()时,所
//获得的结果就不尽相同
context = new Context(new ConcreteStrategyA());
context.contextInterface();
context = new Context(new ConcreteStrategyB());
context.contextInterface();
context = new Context(new ConcreteStrategyC());
context.contextInterface();
}
}
//抽象算法类
abstract class Strategy{
//算法方法
public abstract void algorithmInterface();
}
//具体算法A
class ConcreteStrategyA extends Strategy {
//算法A实现方法
public void algorithmInterface() {
System.out.println("算法A实现");
}
}
//具体算法B
class ConcreteStrategyB extends Strategy {
//算法B实现方法
public void algorithmInterface() {
System.out.println("算法B实现");
}
}
//具体算法C
class ConcreteStrategyC extends Strategy {
//算法C实现方法
public void algorithmInterface() {
System.out.println("算法C实现");
}
}
//上下文
class Context {
Strategy strategy;
//初始化时,传入具体的策略对象
public Context(Strategy strategy) {
this.strategy = strategy;
}
//上下文接口
public void contextInterface() {
//根据具体的策略对象,调用其算法的方法
strategy.algorithmInterface();
}
}