简介:
指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法
对象具有某种行为,但是在不同的场景中,该行为会有不同的算法实现。比如每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。
组成:
- 抽象策略角色: 策略类,通常由一个接口或者抽象类实现。
- 具体策略角色:包装了相关的算法和行为。
- 环境角色:持有一个策略类的引用,最终给客户端调用。
应用场景:
- 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 }