设计模式(7)——策略模式

本文介绍策略模式的概念和应用。

基本思想和原则

定义一组算法,将每个算法都封装起来,使它们之间可以互换。

动机

当一个操作中可以使用多种算法相互替换时,可以挨个实现各个算法,然后用一个上下文封装起来,当需要执行操作时,选择一个策略传入上下文即可。

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public interface IStrategy {
public abstract void work();
}

public class Strategy1 implements IStrategy {
public void work() {
System.out.println("Strategy1 work!");
}
}

public class Strategy2 implements IStrategy {
public void work() {
System.out.println("Strategy2 work!");
}
}

public class Context {
private IStrategy strategy = null;
public void setStrategy(IStrategy strategy) {
this.strategy = strategy;
}
public void work() {
this.strategy.work();
}
}

public class Test {
public static void main(String[] args) {
IStrategy strategy1 = new Strategy1();
IStrategy strategy2 = new Strategy2();

Context context = new Context();
context.setStrategy(strategy1);
context.work();

context.setStrategy(strategy2);
context.work();
}
}

输出结果:

1
2
Strategy1 work!
Strategy2 work!

优点

策略模式中各种算法可以随意切换,想要替换一个算法非常简单,当需要增加新的算法时,只要创建一个新类实现相应接口即可直接使用,同时也避免了在上下文中使用条件判断语句来选择具体算法。

缺点

如果有大量算法,策略模式中可能会有非常多的具体算法类,并且上层模块需要了解每个策略模式的具体算法。