策略模式的定义

策略模式是一种行为型模式,它定义了一系列算法,并将每个算法封装起来,使他们可以相互替换。在实际的使用中,可以在运行时根据实际情况选择不同的策略。

策略模式有这些优点:

  1. 避免使用多重条件语句。
  2. 策略模式可以把一些重复的算法写到父类中,由继承这个父类的子类去调用,避免了重复的代码。

策略模式的缺点:由于每一个策略的实现都需要新增一个策略类,所以可能会造成出现很多的策略类。

模式的结构

策略模式主要有以下这几种结构:

  1. 抽象策略类:定义了一个公共接口,接口定义了策略方法交给子类去实现。抽象策略类一般是接口或者抽象类。
  2. 具体策略:是对抽象策略类的实现,对抽象策略类的不同方法提供具体的实现。
  3. 上下文类(Context):包含了对策略对象的引用,交给我们去调用。

模式的类图

模式的实现

在平常的Java项目开发中,我们都是依赖于Spring或者SpringBoot的,为了便于理解,以及更加贴近我们的日常开发,下面的实现将采用Spring的BeanFactory来作为我们的上下文类,也就是我们把具体的策略都交给Spring容器去管理。

抽象策略类

1
2
3
public interface StrategyService {
void strategyMethod();
}

具体策略

具体策略类1

1
2
3
4
5
6
7
@Service("strategy1Service")
public class Strategy1ServiceImpl implement StrategyService {
@Override
public void strategyMethod() {
System.out.println("这里是具体策略类:1");
}
}

具体策略类2

1
2
3
4
5
6
7
@Service("strategy2Service")
public class Strategy2ServiceImpl implement StrategyService {
@Override
public void strategyMethod() {
System.out.println("这里是具体策略类:2");
}
}

策略的使用

上面省略了上下文类,是因为我们在每个具体策略类中通过Spring的@Service注解,将他们交给Spring容器管理,由Spring帮我们创建具体策略类了。下面是对这些策略的使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Component
public class SrtategyExecutor {
@Resource("strategy1Service")
private StrategyService strategy1Service;

@Resource("strategy1Service")
private StrategyService strategy2Service;

public void srtategyExecutor() {
// 执行具体策略1
strategy1Service.strategyMethod();

// 执行具体策略2
strategy2Service.strategyMethod();
}
}