简介:
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以互相替换。策略模式让算法独立于使用它的客户而独立变化
使用场景:
1,针对同一类问题的多种处理方式,仅仅是具体行为又差别时
2,需要安全地封装多种同一类型的操作时
3,出现同一抽象类的多个子类,而又需要使用if-else 或者 switch-case来选择具体子类时。
例子:
比如家里有两只动物,但是各个动物吃的粮食的不一样,我们需要喂对应的动物吃对应的粮食。
public class StrategyClient {
private static final int CAT = 1;
private static final int DOG = 2;
public static void main(String[] args) {
StrategyClient client = new StrategyClient();
System.out.println(client.animalEat(CAT));
System.out.println(client.animalEat(DOG));
}
public String animalEat(int animal){
if (animal == CAT) {
return catEat();
}else if (animal == DOG) {
return dogEat();
}
return null;
}
private String catEat(){
return "猫食";
}
private String dogEat(){
return "狗粮";
}
}
上面的例子明显不是单一的指责,需要通过if-else的形势才能判断,不遵循开闭原则,扩展性也不好,如果这时家里突然来了一只兔子,还得需要添加一个常量,一个方法 再修改一下animalEat方法,这样如果添加跟多就会代码混乱不堪,难以维护。
策略模式就是解决这样的情况
接下来是策略模式:
public class StrategyClient {
private static final int CAT = 1;
private static final int DOG = 2;
private AnimalEat mAnimal;
public static void main(String[] args) {
StrategyClient client = new StrategyClient();
client.setAnimal(new CatEat());
System.out.println(client.getAnimal().animalEat());
}
public void setAnimal(AnimalEat animal){
mAnimal = animal;
}
public AnimalEat getAnimal(){
return mAnimal;
}
}
interface AnimalEat{
public String animalEat();
}
class CatEat implements AnimalEat {
@Override
public String animalEat() {
return "猫粮";
}
}
class DogEat implements AnimalEat{
@Override
public String animalEat() {
return "狗粮";
}
}
从上面的方法,就不需要if-else,结构也很清晰,我们将动物吃的东西直接在类中实现。如果这是来了一只兔子,只需要创建一个类,实现AnimalEat就行。
这种方法明显是比if-else来解决问题的要好,减少代码臃肿,逻辑复杂,难以维护和升级等,这个扩展性还很高。
参考:
《Android源码设计模式解析与实战》