策略模式是一种行为型设计模式,它通过定义不同算法族并将其封装起来,让这些算法可以相互替换,并且可以独立于使用它们的客户而变化。
该模式提供了一种灵活的方式,使得不同的算法可以在运行时动态地切换和应用,从而满足不同场景下的需求。简而言之,策略模式就是定义一系列的算法,将每个算法封装起来,并使它们可以互换。
策略模式的主要角色如下:
-
抽象策略(Strategy)类:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
-
具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现或行为。
-
环境(Context)类:持有一个策略类的引用,最终给客户端调用。
使用案例:
当我们需要解决某个问题,假设这个问题有好几种解决方案,每一种解决方案的实现细节都不同,那么我们就可以就不同的解决方案封装成专门的算法在后续解决问题是只需要手动指定使用什么方案解决就可以切换解决方案了。
1、编写一个抽象策略,在策略中提供抽象解决方法
public interface Answer {
void slove();
}
2、编写两个具体策略,实现抽象策略中的抽象方法
public class Answer1 implements Answer{
@Override
public void slove() {
System.out.println("解决方案 1");
}
}
public class Answer2 implements Answer{
@Override
public void slove() {
System.out.println("解决方案 2");
}
}
3、编写环境类,所遇到的问题,需要使用方法解决
public class Question {
private final Answer answer;
/**
* 在对象实例化是就需要提供解决方案
**/
public Question(Answer answer) {
this.answer = answer;
}
public void answer(){
System.out.println("解决问题了...");
this.answer.slove();
}
}
4、然后就可以测试了
public static void main(String[] args) {
//我们使用 解决方案2 来解决问题
Question question = new Question(new Answer2());
question.answer();
}
//测试结果
解决问题了...
解决方案 2
策略模式的基本特征:
-
定义抽象策略类,提供抽象方法
-
声明不同的具体策略,实现抽象方法
-
声明所需环境,客户端调用。
策略模式相对比较简单,需要将抽象策略聚合到环境类中,在实例化环境时,在构造器中致命所需要的解决策略方案即可。