1. 策略模式简介

1.1 简介

定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。

1.2 意图

定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。

1.3 UML图

我们将创建一个定义活动的 Strategy 接口和实现了 Strategy 接口的实体策略类。Context 是一个使用了某种策略的类。

StrategyPatternDemo,我们的演示类使用 Context 和策略对象来演示 Context 在它所配置或使用的策略改变时的行为变化。

Spring中使用到的设计模式(九)----策略模式

1.4 优缺点

优点:1、算法可以自由切换

    2、避免使用多重条件判断;

    3、扩展性良好。

缺点:1、策略类会增多

           2、所有策略类都需要对外暴露

1.5 应用实例

1、诸葛亮的锦囊妙计,每一个锦囊就是一个策略。

2、旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。

3、JAVA AWT 中的 LayoutManager。

1.6 主要解决的问题

在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。

1.7 应用场景

1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。

2、一个系统需要动态地在几种算法中选择一种。

3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

1.8 注意事项

如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。

2. 策略模式的实现

/**

 * 定义抽象策略角色

 */

public interface Strategy {

//定义了实现两个数字的计算方式

public int calc(int num1,int num2);

}

/**

 * 加法策略

 */

public class AddStrategy implements Strategy{

@Override

public int calc(int num1, int num2) {

return num1+num2;

}

}

/**

 * 减法策略

 */

public class SubStrategy implements Strategy{

@Override

public int calc(int num1, int num2) {

return num1-num2;

}

}

/**

 * 环境角色

 * 类似于TreeSet

 */

public class Environment {

//持有对策略类的引用

private Strategy strategy;

//类似于TreeSet

public Environment(Strategy strategy) {

this.strategy = strategy;

}

public int calulate (int num1, int num2) {

return strategy.calc(num1, num2);

}

}

/**

 * 测试类

 */

public class MainTest {

public static void main(String[] args) {

Strategy strategy = new AddStrategy();

Environment environment = new Environment(strategy);

int result = environment.calulate(1, 1);

System.out.println(result);

}

}

相关文章: