设计模式——策略模式

160 阅读2分钟

一、概述

策略模式也是一种行为模式。当我们定义了一组算法后,将每个算法封装到一个独立的类中,并且每个算法可以互换,策略模式使得这些算法在客户端调用它们的时候互不影响地变化,并可以把行为和环境分开。

策略模式一般包含有3个角色:

  • 抽象的策略角色:策略类,通常由一个接口或者抽象类实现。
  • 具体的策略角色:封装了相关的算法。
  • 环境角色:持有策略类的引用,暴露给客户端调用。

下面我们就以生活中的出行方式来举个具体的栗子。

二、使用

出行方式一般有火车、汽车、飞机,这三个就相当于出行的算法。我们先创建一个出行的抽象接口,来作为抽象的策略角色:

public interface TravelInterface {
    String travel();
}

再创建火车、飞机、汽车这3个具体的策略角色:

public class BusTravel implements TravelInterface{
    @Override
    public String travel() {
        return "汽车出行";
    }
}
public class TrainTravel implements TravelInterface{
    @Override
    public String travel() {
        return "火车出行";
    }
}
public class AirplaneTravel implements TravelInterface{
    @Override
    public String travel() {
        return "飞机出行";
    }
}

然后,我们创建一个环境角色,封装出行方式的策略。

public class WhichTransportation {

    private TravelInterface travelInterface;

    public WhichTransportation(TravelInterface travelInterface){
        this.travelInterface = travelInterface;
    }

    public void setTravelInterface(TravelInterface travelInterface){
        this.travelInterface = travelInterface;
    }

    public String select(){
        return "我选择:" + travelInterface.travel();
    }
}

最后来测试:

TravelInterface travelInterface = new TrainTravel();
WhichTransportation which = new WhichTransportation(travelInterface);
Log.e(TAG, which.select());
Log.e(TAG, "----------------------");
which.setTravelInterface(new BusTravel());
Log.e(TAG, which.select());
Log.e(TAG, "----------------------");
which.setTravelInterface(new AirplaneTravel());
Log.e(TAG, which.select());

打印输出如下。

三、总结

从上面的例子中我们可以看到,策略模式可以自由的切换不同的策略算法,当需要定义新的算法时扩展性也很好,也避免了多重的条件判断。策略模式在设计的时候必须确保客户端知道所有的策略,再根据具体的逻辑来使用哪种策略,所以客户端对算法的内部是需要知道的,这带来了安全性问题。并且如果具体的策略很多的话,会产生大量的类。

github地址:github.com/leewell5717…

四、参考

Java策略模式(Strategy)