策略模式

瘦欲@ 提交于 2019-11-28 05:05:43

简介:

  指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法

  对象具有某种行为,但是在不同的场景中,该行为会有不同的算法实现。比如每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。

组成:

  • 抽象策略角色: 策略类,通常由一个接口或者抽象类实现。
  • 具体策略角色:包装了相关的算法和行为。
  • 环境角色:持有一个策略类的引用,最终给客户端调用。

应用场景:

  • 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 }

 

 

 

 

 

 

 

 

 

 

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!