简介
策略模式是属于行为模式的,在策略模式中,一个类的行为或算法可以在运行时更改。其思想是针对一组算法,将每一种算法都封装到具有共同接口的独立的类中,从而是它们可以相互替换。策略模式的最大特点是使得算法可以在不影响客户端的情况下发生变化,从而改变不同的功能。
优点
- 算法可以自由切换
- 避免使用多重判断条件
- 扩展性良好
缺点
- 策略类会增多
- 所有策略类都需要对外暴露
使用场景
- 使用在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
- 一个系统需要动态地在几种算法中选择一种。
- 如果一个对象有很多的行为,如果不用恰当的模式,这些行为只好使用多重的条件选择语句来实现。
组成
- 抽象策略角色:是一个抽象的角色,通常情况下使用接口或者抽象类去实现。
- 具体策略角色:包装了具体的算法和行为。
- 环境角色:内部持有一个抽象角色的引用,给客户端调用。
UML类图
实现步骤
- 1.定义一个抽象策略角色,为策略对象定义一个公共的接口
- 2.编写具体策略角色,实现上面的接口
- 3.定义环境角色,内部持有一个策略类的引用。
示例
小明去上学有很多种方式可以选择,例如有步行,私家车,自行车等方式,现在将这个例子来讲解策略模式。
- 定义一个抽象的接口Strategy,是一个抽象策略的角色。
/**
* 抽象策略者角色
*/
public interface Strategy {
void goToSchool();
}
- 2.定义各个的具体策略者。
/**
* 具体的策略者,实现抽象策略者的接口
*/
class WalkStrategy implements Strategy{
@Override
public void goToSchool() {
System.out.println("走路去上学。");
}
}
class BicycleStrategy implements Strategy{
@Override
public void goToSchool() {
System.out.println("骑自行车去上学。");
}
}
class CarStrategy implements Strategy{
@Override
public void goToSchool() {
System.out.println("搭车去上学。");
}
}
- 3.定义环境角色,通过聚合的方式与Strategy进行关联,编写提供给客户端调用的方法。
/**
* 环境角色,提供给客户进行调用
*/
public class Context {
private Strategy mStrategy;
public Context(Strategy strategy){
mStrategy=strategy;
}
/**
* 提供给客户端调用的方法
*/
public void goToSchoolMethod(){
mStrategy.goToSchool();
}
}
- 4.具体的使用
public class StrategyPattern {
public static void main(String[] args){
Context context1=new Context(new WalkStrategy());
context1.goToSchoolMethod();
Context context2=new Context(new BicycleStrategy());
context2.goToSchoolMethod();
Context context3=new Context(new CarStrategy());
context3.goToSchoolMethod();
}
}
输出结果:
走路去上学。
骑自行车去上学。
搭车去上学。