使用策略模式简化你的if else代码

366 阅读2分钟

什么是策略模式

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

举个栗子:

假设要出去旅游,而出行的方式有很多,可以步行,坐火车,坐飞机等。而如果不使用任何设计模式,代码大概就是这样子:

public class TravelStrategy {
        enum Strategy{
            WALK,PLANE,TRAIN
        }
        private Strategy strategy;
        public TravelStrategy(Strategy strategy){
            this.strategy=strategy;
        }

        public void travel(){
            if(strategy==Strategy.WALK){
                print("walk");
            }else if(strategy==Strategy.PLANE){
                print("plane");
            }else if(strategy==Strategy.TRAIN){
                print("train");
            }
        }

        public static void main(String[] args) {
            TravelStrategy walk=new TravelStrategy(Strategy.WALK);
            walk.travel();
            TravelStrategy plane=new TravelStrategy(Strategy.PLANE);
            plane.travel();
            TravelStrategy train=new TravelStrategy(Strategy.TRAIN);
            train.travel();
        }
    }

这样做有一个致命的缺点,一旦出行的方式增加就不得不增加新的if else,而这违反了开闭原则,如果我们使用策略模式则可以解决大量使用if else问题。

首先,定义策略接口

public interface Strategy {
  void travel();
}

然后根据不同的出行方式实行策略接口

    public class WalkStrategy implements Strategy{
        @Override
        public void travel() {
            System.out.println("walk");
        }
    }
    public class PlaneStrategy implements Strategy{
        @Override
        public void travel() {
            System.out.println("plane");
        }
    }
    public class TrainStrategy implements Strategy{
        @Override
        public void travel() {
            System.out.println("train");
        }
    }

此外还需要一个包装策略的类,并调用策略接口中的方法

    public class TravelContext {
        Strategy strategy;
        public Strategy getStrategy() {
            return strategy;
        }
        public void setStrategy(Strategy strategy) {
            this.strategy = strategy;
        }
        public void travel() {
            if (strategy != null) {
                strategy.travel();
            }
        }
    }

测试代码

    public class Test {
        public static void main(String[] args) {
            TravelContext travelContext=new TravelContext();
            travelContext.setStrategy(new PlaneStrategy());
            travelContext.travel();
            travelContext.setStrategy(new WalkStrategy());
            travelContext.travel();
            travelContext.setStrategy(new TrainStrategy());
            travelContext.travel();
        }
    }

可以看到,应用了策略模式后,如果想增加新的出行方式,完全不必要修改现有的类,只需要实现策略接口即可,这就是面向对象中的对扩展开放的原则。假设新增加自行车出行的方式,只需新增一个类即可。

    public class BikeStrategy implements Strategy{
        @Override
        public void travel() {
            System.out.println("bike");
        }
    }

之后设置策略

    public class Main {
        public static void main(String[] args) {
            TravelContext travelContext=new TravelContext();
            travelContext.setStrategy(new BikeStrategy());
            travelContext.travel();
        }
    }