使用策略模式来解决 if-else场景

334 阅读2分钟

各位在写业务代码的时候尤其是 详情页的时候, 会遇到很多状态比较复杂的场景, 这时候会涉及到大量的if-else的问题, 如果代码复杂起来之后会很难维护, 其实可以通过策略模式去解决这些问题, 代码如下:

首先创建一个接口:

/**
 * 策略接口
 */
public interface AnimalStrategy {

    void sleep();

    void eat();

    void sports();
}

但是各个动物其实有些 共同的行为 例如睡觉, 这时候需要创建一个抽象类 统一维护通用的行为.

/**
 * 策略基类, 用来维护通用的行为
 * @author live
 */
public abstract class BaseAnimalStrategy implements AnimalStrategy{
    @Override
    public void sleep() {
        System.out.println("动物都是一种睡觉方式");
    }
}

以下是具体策略:

public class ElephantAnimalStrategy extends BaseAnimalStrategy{

    @Override
    public void eat() {
        System.out.println("食草的");
    }

    @Override
    public void sports() {
        System.out.println("散步");
    }
}
public class TigerAnimalStrategy extends BaseAnimalStrategy {

    @Override
    public void eat() {
        System.out.println("肉食主义者");
    }

    @Override
    public void sports() {
        System.out.println("捕猎就是运动");
    }
}

为了方便调用以及维护, 我设计了一个枚举, 搭配工厂类统一使用:

/**
 * 维护策略的枚举.
 * @author live
 */
public enum AnimalEnum {

    ELEPHANT(1, "com.sky.marshall.demo.strategy.ElephantAnimalStrategy"),
    TIGER(2, "com.sky.marshall.demo.strategy.TigerAnimalStrategy"),
    ;

    int index;
    String className;

    AnimalEnum(int index, String className) {
        this.index = index;
        this.className = className;
    }

    public int getIndex() {
        return index;
    }

    public String getClassName() {
        return className;
    }

}

工厂类来创建实例:

public class AnimalFactory {
    private AnimalFactory() {
    }

    public static AnimalStrategy newInstance(AnimalEnum animalEnum) throws Exception {
        final Class<?> aClass = Class.forName(animalEnum.getClassName());
        final AnimalStrategy animalStrategy = (AnimalStrategy) aClass.newInstance();
        return animalStrategy;
    }
}

注意: 以上其实可以用数据库代替枚举, 也可以用托管为spring的方式 注入bean来代替 反射创建实例, 看具体应用了.

接下来调用main函数测试:

/**
 * 这里用的是反射获取到实例, 日常开发当然也可托管给spring  用注入bean的方式去获取 实例.
 *
 * @author Live
 */
public class Main {
    public static void main(String[] args) throws Exception {
        run(AnimalEnum.ELEPHANT);
        run(AnimalEnum.TIGER);
    }

    private static void run(AnimalEnum animalEnum) throws Exception {
        final AnimalStrategy animalStrategy = AnimalFactory.newInstance(animalEnum);

        animalStrategy.eat();
        animalStrategy.sleep();
        animalStrategy.sports();
    }
}

结果如下:

食草的
动物都是一种睡觉方式
散步
肉食主义者
动物都是一种睡觉方式
捕猎就是运动

以上就是简单的策略模式的应用.