一 简介
定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化(实质就是算法的选择)。
使用场景:
- 当一个系统中有许多类,它们之间的区别仅在于它们的行为,希望动态地让一个对象在许多行为中选择一种行为时;
- 当一个系统需要动态地在几种算法中选择一种时;
- 当一个对象有很多的行为,不想使用多重的条件选择语句来选择使用哪个行为时。
包含以下角色:
- 环境(Context)角色:持有一个Strategy的引用。
- 抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
- 具体策略(ConcreteStrategy)角色:包装了相关的算法或行为
二 实例
我们通过一个对不同级别的会员实施不同折扣的例子来实现策略模式。
抽象策略(Strategy)角色:
public interface Strategy {
double getMoney(double money);
}
具体策略角色(3个策略)
public class StrategyA implements Strategy {
@Override
public double getMoney(double money) {
System.out.println("对于A级别会员 打九折:");
return money*0.9;
}
}
public class StrategyB implements Strategy {
@Override
public double getMoney(double money) {
System.out.println("对于B级别会员 打六折");
return money*0.6;
}
}
public class StrategyC implements Strategy {
@Override
public double getMoney(double money) {
System.out.println("对于C级别会员 打三折");
return money*0.3;
}
}
环境角色:
public class Context {
Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public double getMoney(double money){
return this.strategy.getMoney(money);
}
}
Demo(都是对100元进行打折)
public class Demo {
public static void main(String[] args) {
Context context = new Context(new StrategyA());
System.out.println(context.getMoney(100));
context = new Context(new StrategyB());
System.out.println(context.getMoney(100));
context = new Context(new StrategyC());
System.out.println(context.getMoney(100));
}
}
结果:
对于A级别会员 打九折:
90.0
对于B级别会员 打六折
60.0
对于C级别会员 打三折
30.0
优点:
- 算法可以自由切换;
- 避免使用多重条件判断;
- 扩展性良好。
缺点:
- 策略类会增多
- 所有策略类都需要对外暴露