简介:
指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法
对象具有某种行为,但是在不同的场景中,该行为会有不同的算法实现。比如每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。
组成:
- 抽象策略角色: 策略类,通常由一个接口或者抽象类实现。
- 具体策略角色:包装了相关的算法和行为。
- 环境角色:持有一个策略类的引用,最终给客户端调用。
应用场景:
- 1、 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。
- 2、 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。
- 3、 对客户隐藏具体策略(算法)的实现细节,彼此完全独立。
代码举例:
旅游出行,交通工具有飞机(Airplane)、火车(Train)、骑自行车(Bicycle)。
1 /**
2 * 策略模式
3 * 定义一系列的算法,把每一个算法封装起来,并且使它们可相互替换。
4 * 本模式使得算法可独立于使用它的客户变化
5 */
6 public interface TravelStrategy {
7
8 void travel();
9 }
1 /**
2 * 具体策略一:乘坐飞机
3 */
4 public class AirPlaneStrategy implements TravelStrategy {
5
6 public void travel() {
7 System.out.println("坐飞机去旅游。。。");
8 }
9 }
1 /**
2 * 具体策略二:坐火车
3 */
4 public class TrainStrategy implements TravelStrategy {
5 public void travel() {
6 System.out.println("坐火车去旅游。。。");
7 }
8 }
1 /**
2 * 具体策略三:骑自行车
3 */
4 public class BicycleStrategy implements TravelStrategy {
5 public void travel() {
6 System.out.println("骑自行车去旅游。。。。");
7 }
8 }
1 /**
2 * 环境类(Context):
3 * 用一个ConcreteStrategy对象来配置。
4 * 维护一个对Strategy对象的引用。可定义一个接口来让Strategy访问它的数据。
5 * 算法解决类,以提供客户选择使用何种解决方案:
6 */
7 public class PersonContext {
8
9 private TravelStrategy travelStrategy;
10
11 public PersonContext(TravelStrategy travelStrategy) {
12 this.travelStrategy = travelStrategy;
13 }
14
15 public void travel(){
16 travelStrategy.travel();
17 }
18
19 }
测试
1 public class MainApp {
2
3 public static void main(String[] args) {
4 TravelStrategy strategy1 = new AirPlaneStrategy();
5 PersonContext person1 = new PersonContext(strategy1);
6 person1.travel(); //坐飞机去旅游。。。
7
8
9 TravelStrategy strategy2 = new TrainStrategy();
10 PersonContext person2 = new PersonContext(strategy2);
11 person2.travel(); //坐火车去旅游。。。
12 }
13 }