策略模式
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
与状态模式的比较
状态模式的类图和策略模式类似,并且都是能够动态改变对象的行为。但是状态模式是通过状态转移来改变 People 所组合的 State 对象,而策略模式是通过 Num 本身的决策来改变组合的 Strategy 对象。所谓的状态转移,是指 People 在运行过程中由于一些条件发生改变而使得 State 对象发生改变,注意必须要是在运行过程中。
状态模式主要是用来解决状态转移的问题,当状态发生转移了,那么 People 对象就会改变它的行为;而策略模式主要是用来封装一组可以互相替代的算法族,并且可以根据需要动态地去替换 People 使用的算法。
示例演示:
创建一个策略接口
1
2
3
4
5
6
7package test.strategy;
public interface Strategy {
public int execute(int num1, int num2);
}分别写一个加法,一个减法的具体实现类
1
2
3
4
5
6
7
8
9package test.strategy;
public class Add implements Strategy {
public int execute(int num1, int num2) {
return num1 + num2;
}
}1
2
3
4
5
6
7
8
9package test.strategy;
public class Subtract implements Strategy {
public int execute(int num1, int num2) {
return num1 - num2;
}
}编写Num具体类
1
2
3
4
5
6
7
8
9
10
11
12
13package test.strategy;
public class Num {
private Strategy strategy;
public void SetStrategy(Strategy strategy) {
this.strategy = strategy;
}
public int execute(int num1, int num2) {
return strategy.execute(num1, num2);
}
}完成上述步骤,我们就可以开始演示了
1
2
3
4
5
6
7
8
9
10
11package test.strategy;
public class StrategyDemo {
public static void main(String[] args) {
Num num = new Num();
num.SetStrategy(new Add());
System.out.println("10+6=" + num.execute(10, 6));
num.SetStrategy(new Subtract());
System.out.println("10-6=" + num.execute(10, 6));
}
}演示结果:
1
210+6=16
10-6=4
说明:
优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。
缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。