策略模式也叫政策模式。

这是一个关于策略模式的故事。假设 Mike某个时候开车超速,但是他不是总是这样做。他有可能被警察叫停。也许这个警察很好,不给他罚单或者警告。(让我们吧这样的警察叫做”NicePolice”)。也有可能被抓到让后给予罚单。(让我们叫这样的警察”HardPolice”)。他不知道什么警察会把他叫停,直到他被逮住,如果那样运行,那就是策略模式的关注点。

策略模式的类图

 Arrayin Memory

策略模式的java代码

定义一个Strategy接口,它是用来处理超速的,有一个方法 processSpeeding()。

1
2
3
4
public interface Strategy {
//定义了警察来处理超速情况的方法。
public void processSpeeding(int speed);
}

现在我们来实现两种警察。

1
2
3
4
5
6
public class NicePolice implements Strategy{
@Override
public void processSpeeding(int speed) {
System.out.println("This is your first time, be sure don't do it again!");
}
}
1
2
3
4
5
6
public class HardPolice implements Strategy{
@Override
public void processSpeeding(int speed) {
System.out.println("Your speed is "+ speed+ ", and should get a ticket!");
}
}

定义一种情况,即一名警察处理超速。

1
2
3
4
5
6
7
8
9
10
11
public class Situation {
private Strategy strategy;
public Situation(Strategy strategy){
this.strategy = strategy;
}
public void handleByPolice(int speed){
this.strategy.processSpeeding(speed);
}
}

好了完成,看看结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Main {
public static void main(String args[]){
HardPolice hp = new HardPolice();
NicePolice ep = new NicePolice();
// 第一种情况, 遇见了hard officer
// 第一种情况, 遇见了nice officer
Situation s1 = new Situation(hp);
Situation s2 = new Situation(ep);
//结果是根据遇见的警察来看的
s1.handleByPolice(10);
s2.handleByPolice(10);
}
}

输出:

Your speed is 10, and should get a ticket!
This is your first time, be sure don't do it again!

你可以把这个设计模式与状态模式(State)比较,他们很相像。主要的区别是当对象的状态发生改变时,状态模式涉及到改变一个对象的行为,而策略模式主要是在不同的情况使用不同的算法。

在JDK中的策略模式

1). Java.util.Collections#sort(List list, Comparator < ? super T > c)
2). java.util.Arrays#sort(T[], Comparator < ? super T > c)

排序方法在不同的情况下使用不同的比较器、想知道更多,点击深度理解Arrays.sort()

你可能也想了解Java中的Comparable 和 Comparator

参考文档