永远不要轻言放弃
原文地址:http://www.programcreek.com/2011/01/a-java-example-of-strategy-design-pattern/
***********************************************碎碎念的分割线*************************************************
策略模式也称作政策模式。
这有个关于策略模式的故事。假设Mike在有时候开车会超速,但不总是这样。他可能会被警察拦截下。可能这个警官人品比较和善,可能不给mike开罚单或者简单的警告下就让他走了。(我们可以称这样的警官为"NicePolice"。)也有可能他会被难对付的警官逮到还给他开个罚单。(我们可以称这样的警官为"HardPolice"。)他不会知道到底会被哪一种警官会拦截下,直到他真正的被逮到,这就是运行的时间。
这就是策略模式的全部意思。
1、类图
2、Java代码
定义一个接口Strategy,它有一个方法processSpeeding()
interface Strategy {
public void processSpeeding(int speed);
}
两类警官
class NicePolice implements Strategy {
@Override
public void processSpeeding(int speed) {
// TODO Auto-generated method stub
System.out.println("鉴于你第一次犯,下次注意!");
}
}
class HardPolice implements Strategy {
@Override
public void processSpeeding(int speed) {
// TODO Auto-generated method stub
System.out.println("你的速度是" + speed + ",得给你张罚单");
}
}
定义一个场景,调用一名警官来处理超速事件。
class Situation {
private Strategy strategy;
public Situation(Strategy strategy) {
this.strategy = strategy;
}
public void handleByPolice(int speed) {
strategy.processSpeeding(speed);
}
}
测试一下
public class Main {
public static void main(String[] args) {
HardPolice hard = new HardPolice();
NicePolice nice = new NicePolice();
Situation s1 = new Situation(hard);
Situation s2 = new Situation(nice);
s1.handleByPolice(100);
s2.handleByPolice(100);
}
}
输出
你的速度是100,得给你张罚单
鉴于你第一次犯,下次注意!
鉴于你第一次犯,下次注意!
你可以拿策略模式跟状态模式比较一下,他们非常相似。主要不一样的地方是在对象的状态发生改变时,状态模式调用改变对象的行为。而策略模式主要是在不同的场景下用不同的算法。
3、JDK实际应用
1). Java.util.Collections#sort(List list, Comparator < ? super T > c)
2). java.util.Arrays#sort(T[], Comparator < ? super T > c)
2). java.util.Arrays#sort(T[], Comparator < ? super T > c)
sort方法在不同的场景下使用不同的Comparator.