策略模式,顾名思义,我是没看懂。
不知道为什么称它为策略模式,但通过学习,我知道这种模式可以让我的代码分工明确,实现了操作和使用者的解耦。
策略模式共分三个部分:
1.你的操作方法的接口,定义了一个实现的方法
2.你的操作方法的具体实现
3.环境类,用来对具体的操作方法进行设置,比如执行等
举个栗子🌰!
需求:我有三个算法,分别可以解决三个问题,那么我得看看问题是什么来选用不同的方法。
解决方法1:
int questionID = 1; //假设问题是第一个,id为1
if(questionID == 1)
{
fun1();
} else if(questionID == 2)
{
fun2();
}else if(questionID == 3)
{
fun3();
}
以上就是对问题编号先进行判断,通过if语句来找到对应的实现方法。完美!
不好的一点就是,如果算法特别多,再修改就会乱七八糟的,既要修改方法,又要在if语句这里进行修改,多到一定程度,我就爆炸了!BOOM!
所以,我愿意牺牲一点时间,把方法和使用分离开,这里就可以用到策略模式。
我们先写一个大接口!
interface Strategy {
void operate();
}
定义了一个operate()方法,实现这个接口的也要实现这个方法,这是我们定的规则。
再写三个复杂的算法!
class Algorithm1 implements Strategy {
@Override
public void operate() {
System.out.println("algorithm1");
}
}
class Algorithm2 implementsStrategy {
@Override
public void operate() {
System.out.println("algorithm2");
}
}
class Algorithm3 implementsStrategy {
@Override
public void operate() {
System.out.println("algorithm3");
}
}
这三个算法都实现了那个大接口。
最后写一个封装类Context:
class Context {
Strategy strategy;
public Context(Strategy strategy) {
this.strategy= strategy;
}
public void operate(){
strategy.operate();
}
}
封装类的意义就是可以对Strategy进行操作,有时候是可以去掉的。
调用方法:
Context context =newContext(new Algorithm1());
context.operate();
这样就把方法解耦出来,形成一个实现Strategy的单独的类了,我们增添删改算法的时候,就会清晰很多,但是if还是要写的!(我去,这不还是很乱么!)策略模式只是做解耦,并不能把判断语句都取代了呀。如果你想让判断语句好看,你可以用switch,用反射辣。