策略模式(Strategy)
什么时策略模式
该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。
比如,旅游时,可以选择飞机、火车、公共汽车、骑行、步行或者开车等不同的方式,每种方式都是一种策略。
注:策略模式也是一种行为型模式。
策略模式优缺点
优点
- 避免使用多重条件判断。
- 提供一系列算法,可以自由选择切换。
- 扩展方便,可以不修改原代码基础上新增新的算法。
- 策略模式把算法的使用放到环境类中,而算法的实现移到具体策略类中,实现了二者的分离。
缺点
- 策略类增多
- 所有策略算法需暴露客户,以便客户选择。
策略模式结构
策略模式是准备一组算法,并将这组算法封装到一系列的策略类里面,作为一个抽象策略类的子类。策略模式的重心不是如何实现算法,而是如何组织这些算法,从而让程序结构更加灵活,具有更好的维护性和扩展性。
策略模式有以下几个结构:
- 抽象策略(Strategy)类:定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现。
- 具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现。
- 环境(Context)类:持有一个策略类的引用,最终给客户端调用。
实列demo
抽象策略类:定义了旅行策略接口。
public interface TravelStrategy {
void goTravel();
}
具体策略类:实现了旅行策略接口。这里分别是飞机旅行策略、骑行策略、自驾策略、徒步策略。
当新增一种策略时,只需添加一个类实现上述TravelStrategy接口即可。
public class AirplaneStrategy implements TravelStrategy {
@Override
public void goTravel() {
System.out.println("乘飞机去旅行,飞机策略");
}
}
public class BicycleStrategy implements TravelStrategy {
@Override
public void goTravel() {
System.out.println("骑行,骑行策略");
}
}
public class CarStrategy implements TravelStrategy {
@Override
public void goTravel() {
System.out.println("自驾游,自驾策略");
}
}
public class FootStrategy implements TravelStrategy {
@Override
public void goTravel() {
System.out.println("徒步旅行,徒步策略。");
}
}
环境类:提供客户调用。
public class Traveler {
private TravelStrategy travelStrategy;
public TravelStrategy getTravelStrategy() {
return travelStrategy;
}
public void setTravelStrategy(TravelStrategy travelStrategy) {
this.travelStrategy = travelStrategy;
}
public void goTravel() {
travelStrategy.goTravel();
}
}
客户端调用:
public class StrategyTest {
public static void main(String[] args) {
Traveler traveler = new Traveler();
traveler.setTravelStrategy(new AirplaneStrategy());
traveler.goTravel();
System.out.println();
traveler.setTravelStrategy(new CarStrategy());
traveler.goTravel();
System.out.println();
traveler.setTravelStrategy(new FootStrategy());
traveler.goTravel();
System.out.println();
}
}
输出:
乘飞机去旅行,飞机策略
自驾游,自驾策略
徒步旅行,徒步策略。
善始者实繁,克终者盖寡。
---不足或不对的地方欢迎指正。