1.策略模式简单介绍
定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。
策略对象改变 context 对象的执行算法。
2.策略模式的角色
- 环境类(Context):用来操作策略的上下文环境;
- 抽象策略类(Strategy):策略的抽象,出行方式的抽象;
- 具体策略类(ConcreteStrategy):具体的策略实现,每一种出行方式的具体实现。
3.策略模式的简单运用
咱们就拿吃饭这件事儿简单举例:中国人吃饭大多用筷子,外国人大多有刀叉,及其少数人吃饭直接用手,同样是吃饭却有着不同的方式;
抽象策略类(Strategy)
/**
* 抽象策略类(Strategy)
*/
public interface A1_Eat {
String eatTool();
}
具体策略类(ConcreteStrategy) : 中国人吃饭的工具
/**
* 具体策略类(ConcreteStrategy) : 中国人吃饭的工具
*/
public class B1_China implements A1_Eat{
@Override
public String eatTool() {
return "中国人吃饭:善用筷子";
}
}
具体策略类(ConcreteStrategy) : 欧洲人吃饭的工具
/**
* 具体策略类(ConcreteStrategy) : 欧洲人吃饭的工具
*/
public class B2_Europe implements A1_Eat {
@Override
public String eatTool() {
return "欧洲人吃饭:善用刀叉";
}
}
具体策略类(ConcreteStrategy) : 其他极少数人吃饭的工具
/**
* 具体策略类(ConcreteStrategy) : 其他极少数人吃饭的工具
*/
public class B3_Other implements A1_Eat {
@Override
public String eatTool() {
return "少数人吃饭:直接上手";
}
}
环境类(Context):用来操作策略的上下文环境
/**
* 环境类(Context):用来操作策略的上下文环境
*/
public class C1_Persion {
private A1_Eat eat;
/**
* 开始吃饭
*/
public void eatIng(){
System.out.println("拿餐具准备开饭:"+eat.eatTool());
}
public void setEat(A1_Eat eat) {
this.eat = eat;
}
}
开始调用
/**
* 开始调用
*/
public class D1_Client {
/**
* 策略模式 : 定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换
*/
public static void main(String[] args) {
C1_Persion persion = new C1_Persion();
//中国人选餐具开始吃饭
persion.setEat(new B1_China());
persion.eatIng();
//欧洲人人选餐具开始吃饭
persion.setEat(new B2_Europe());
persion.eatIng();
//少数其他人选餐具开始吃饭
persion.setEat(new B3_Other());
persion.eatIng();
}
}
调用结果:
拿餐具准备开饭:中国人吃饭:善用筷子
拿餐具准备开饭:欧洲人吃饭:善用刀叉
拿餐具准备开饭:少数人吃饭:直接上手
4.策略模式的优点
- 1、算法可以自由切换。
- 2、避免使用多重条件判断。
- 3、扩展性良好。
5.策略模式缺点
- 1、策略类会增多。
- 2、所有策略类都需要对外暴露。
6.策略模式的使用场景
- 1、如果在一个系统里面有许多类它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
- 2、一个系统需要动态地在几种算法中选择一种。
- 3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句(if...else)来实现;
7.策略模式与其他模式的区别
- 与状态模式的区别
策略模式只是条件选择方法,[只执行一次方法]; 而状态模式是随着状态的改变[不停地更改执行方法]。 举个例子,就好比我们旅游,对于策略模式我们只需要选择其中一种出行方法就好了, 但是状态模式不一样可能我们到了A地点选择的是火车,到了B地点又选择飞机,根据不同的状态选择不同的出行方式。
- 与工厂模式的区别
工厂模式是创建型模式 [它关注对象创建],提供创建对象的接口,让对象的创建与具体的使用客户无关。 策略模式是对象行为型模式 ,[它关注行为和算法的封装] 。 再举个例子,还是我们出去旅游对于策略模式我们只需要选择其中一种出行方法就好 但是工厂模式不同,工厂模式是你决定哪种旅行方案后,由工厂代替你去构建具体方案(工厂代替你去买火车票)。