0

策略模式

2024.09.11 | cuithink | 1210次围观

定义一系列算法,将每一个算法 封装起来,并使它们可以相互替换。策略模式让算法可以独立于使用它的客户端而变化。

在策略模式中可以定义一些独立的类来封装不同的算法,每一个类封装一种具体 的算法,在这里每一个封装算法的类都可以被称为一种策略,为了保证这些策略在使用时具有一致性,一般会提供一个抽象的策略类来做算法的声明.而每种算法对应一个具体的策略类。

策略模式的主要角色如下:

  • 抽象策略(Strategy)类:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。

  • 具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现或行为。

  • 环境或上下文(Context)类:是使用算法的角色, 持有一个策略类的引 用,最终给客户端调用。

应用场景

1. 需要根据不同的条件选择不同的算法时。例如,计算器程序需要根据用户输入的运算符选择相应的计算方法。

2. 需要在运行时动态地选择算法时。例如,某个系统需要根据用户的配置或环境变量来选择合适的算法。

3. 需要将算法的实现细节与客户端代码分离时。例如,某个系统需要根据不同 的数据来源来解析数据,但是客户端并不关心数据的解析细节。

代码

public interface Strategy {
    void algorithm();
}
public class ConcreteStrategyA implements Strategy {
    @Override
    public void algorithm() {
        System.out.println("执行策略A");
    }
}
public class ConcreteStrategyB implements Strategy {
    @Override
    public void algorithm() {
        System.out.println("执行策略B");
    }
}

//环境类
public class Context {
    //维持一个对抽象策略类的引用
    private Strategy strategy;
    public Context(Strategy strategy) {
        this.strategy = strategy;
    }
    //调用策略类中的算法
    public void algorithm(){
        strategy.algorithm();
    }
}

public class Client {
    public static void main(String[] args) {
        Strategy strategyA = new ConcreteStrategyA();
        Context context = new Context(strategyA); //可以在运行
        时指定类型,通过配置文件+反射机制实现
        context.algorithm();
    }
}


粤ICP备16076548号
发表评论