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