策略模式
概念:
策略模式就是定义不同的算法,或者说不同的情况并且将不同的行为方式封装起来,根据不同的情况来使用不同的算法或者行为,当然,前提是结果都是一致的。
官方的说法是:
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变换。
我们先从例子说起吧,其实很简单:我们平时在做算法的时候会想到很多情况,比如说数值,返回值不同,使用不同的算法,用一个if else判断,或者swich判断,进行不同的算法,这里,从一个生活的实例说起吧:
我们出门旅游。有三种不同的算法(方式),步行,飞机,火车
//旅游策略类
public class TravelStrategy {
//枚举中定义了三种不同的算法常量
enum Strategy{
//步行,飞机,火车
WALK,PLANE,SUBWAY
}
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.SUBWAY){
print(subway);
}
}
public void print(String str){
System.out.println(出行旅游的方式为:+str);
}
public static void main(String[] args) {
//调用方法
TravelStrategy walk=new TravelStrategy(Strategy.WALK);
walk.travel();
TravelStrategy plane=new TravelStrategy(Strategy.PLANE);
plane.travel();
TravelStrategy subway=new TravelStrategy(Strategy.SUBWAY);
subway.travel();
}
}
这些都是正常思维方式下我们平时使用的方式。但是这样做有一个致命的缺点,一旦出行的方式要增加,我们就不得不增加新的else if语句,而这违反了面向对象的原则之一,对修改封闭。而这时候,策略模式则可以完美的解决这一切。
那么用策略模式如何去做呢??
步骤:(分四步):
1,创建旅游接口,定义旅游方法
2,创建不同的实现类,实现接口,
3,创建策略包装类,实现包装
4,方法的调用
接口
public interface Strategy {
void travel();
}
实现类:1,2,3
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 SubwayStrategy implements Strategy{
@Override
public void travel() {
System.out.println(subway);
}
}
包装类
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 Main { 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 SubwayStrategy());
travelContext.travel();
}
}
这样,如果以后只要增加了旅游的方式,只需要增加实现类就可以了,符合面向对象的思想