美文网首页
(拾起.笔记)设计模式之策略模式

(拾起.笔记)设计模式之策略模式

作者: 其实小吴人挺好 | 来源:发表于2018-06-11 16:54 被阅读0次

简介:

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以互相替换。策略模式让算法独立于使用它的客户而独立变化

使用场景:

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源码设计模式解析与实战》

相关文章

网友评论

      本文标题:(拾起.笔记)设计模式之策略模式

      本文链接:https://www.haomeiwen.com/subject/hdpheftx.html