一、前言
策略模式是我们在项目设计中会经常用到的一种设计模式。在一些场景中,一些算法或者类的行为需要改变,如果用传统的继承来实现的话,会使得代码的设计不合理,而且在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。策略模式就是为了解决这个些算法或者类的行为需要改变的场景。
二、策略模式
概述:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
使用场景:
1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
2、一个系统需要动态地在几种算法中选择一种。
3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。
缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。
策略模式其实就是将一些算法或者行为不同实现部分抽取出来,定义成抽象方法,这些方法的具体实现由子类来实现。很多时候我们容易将策略模式与模板模式搞混,但仔细区分还是比较好区分的,策略模式主要使用了组合的方式,策略模式将类的行为和方法单独抽取出来,由子类实现,这些行为和方法都是独立存在的,不区分先后顺序。而模板模式是父类已经定义好一个流程步骤的模板,只是将某一个步骤中的不同行为抽取出来,由子类来实现这些流程中的某个步骤,在整个流程中步骤已经固定,不能更改,子类只能实现步骤中被抽象的部分,所以模板模式主要还是用的继承的方式来实现。
三、代码展示
我们通过一个小例子来展示策略模式,策略模式侧重点就是一个组合的方式,将抽象的接口组合在一个类中,这样不同的子类就可以实现继承该接口的方法,同时也做到一个解耦的效果。
3.1 定义一个接口
public abstract class Strategy {
public abstract void method();
}
3.2 实现这个接口
public class StrategyImplA extends Strategy {
public void method() {
System.out.println("这是第一个实现");
}
}
public class StrategyImplB extends Strategy {
public void method() {
System.out.println("这是第二个实现");
}
}
public class StrategyImplC extends Strategy {
public void method() {
System.out.println("这是第三个实现");
}
}
3.3 将算法进行封装
public class Context {
Strategy stra;
public Context(Strategy stra) {
this.stra = stra;
}
public void doMethod() {
stra.method();
}
}
3.4 结果展示
public class Test {
public static void main(String[] args) {
Context ctx = new Context(new StrategyImplA());
ctx.doMethod();
ctx = new Context(new StrategyImplB());
ctx.doMethod();
ctx = new Context(new StrategyImplC());
ctx.doMethod();
}
}
这是第一个实现
这是第二个实现
这是第三个实现