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