多种算法写在一个类中,根据条件使用if-else调用的常规做法的替代方案。实现主业务逻辑与算法策略的解耦,对多种策略分而治之,结构更清晰。
定义
定义了一系列的算法,并将每一种算法封装起来,使他们还可以互相替换。使算法独立于使用它的客户而独立变化。
角色
Context——环境角色:用来操作策略的上下文环境。
1.内部维护一个Strategy的实例。
2.提供公共方法,用于设置Strategy实例为某一具体的算法。
3.负责跟Strategy之间的交互和数据传递。
Strategy——策略角色:一个接口或一个抽象类。
定义一个公共接口,Context使用这个接口调用不同的算法。
ConcreteStrategy——具体策略角色:封装了相关算法和行为的一组类。
实现了Strategy定义的接口,提供具体的算法实现。
示例代码
/**
*策略角色(Strategy)
*费用策略
*/
interface CalculateStrategy{
public int calculateFee(int days);
}
/**
*具体策略类(ConcreteStrategy)
*1:乘坐飞机
*/
public class AirPlaneStrategy implements CalculateStrategy{
@override
public int calculateFee(int days){
return days*500+2*2000;
}
}
/**
*具体策略类(ConcreteStrategy)
*2:乘坐高铁
*/
public class HighSpeedRailStrategy implements CalculateStrategy{
@override
public int calculateFee(int days){
return days*500+2*900;
}
}
/**
*环境类(Context)
* 旅行费用计算
*/
public class TravelFee{
CalculateStrategy mStrategy;
public void setStrategy(CalculateStrategy strategy ){
this.mStrategy = strategy;
}
public int calculateFee(int days){
return strategy.calculateFee(days)
}
}
/**
* 旅行使用策略模式计算费用
*/
public class Travel{
int days;
public static void main(String[] args){
//其他业务逻辑
//计算费用
days = 3;
TravelFee travelee = new TravelFee();
travelee.setStrategy(new AirPlaneStrategy());
system.out.println("乘坐飞机旅行的费用:"+travelee.calculateFee(days ));
travelee.setStrategy(new HighSpeedRailStrategy());
system.out.println("乘坐高铁旅行的费用:"+travelee.calculateFee(days ));
}
}
如果需要新增一种长途巴士出行旅游的方式,只需要增加一个IntercityBusStrategy,实现接口CalculateStrategy即可,不需要修改TravelFee原有的费用计算逻辑。
如果需求变化,某一种策略的计算方式发生变化,只需要单独修改相应策略类即可,旅行费用类和其他类都不受影响。