以出行为例实现策略模式
BigDecimal price = new BigDecimal("100");
if (price.compareTo(new BigDecimal("200")) < 0) {
System.out.println("单车出行");
} else if (price.compareTo(new BigDecimal("200")) >= 0
&& price.compareTo(new BigDecimal("500")) <= 0) {
System.out.println("火车出行");
} else if (price.compareTo(new BigDecimal("1000")) >= 0) {
System.out.println("飞机出行");
} else {
System.out.println("走路");
}
更长的if_else if_else.........
当在项目中碰到代码存在大量的if_else if _else时,根据业务实际需求,可以选择相应的解决办法。
现在以策略模式为例,优化大量的if_else if _else
第一种策略模式实现
定义接口
public interface TravelStrategy {
// 出行方式
void travel();
}
// 单车出行方式
public class BicycleTravel implements TravelStrategy {
@Override
public void travel() {
System.out.println("单车出行");
}
}
// 火车出行方式
public class TrainTravel implements TravelStrategy {
@Override
public void travel() {
System.out.println("火车出行");
}
}
// 飞机出行方式
public class AircraftTravel implements TravelStrategy {
@Override
public void travel() {
System.out.println("飞机出行");
}
}
// 出行策略方法
public class Strategy {
private TravelStrategy travelStrategy;
private void setTravelStrategy(TravelStrategy travelStrategy) {
this.travelStrategy = travelStrategy;
}
public void travelStyle() {
strategy.travel();
}
}
// 测试类
public static void main(String[] args) {
Strategy strategy = new Strategy();
// 三种出行方式,选择一种策略
strategy.setTravelStrategy(new TrainTravel());
strategy.setTravelStrategy(new AircraftTravel());
strategy.setTravelStrategy(new BicycleTravel());
strategy.travelStyle();
}
第二种策略模式实现
定义接口
public interface TravelStrategy {
// 出行方式
void travel();
// 根据价格匹配
boolean match(BigDecimal price);
}
// 飞机出行
public class AircraftTravel implements TravelStrategy {
@Override
public void travel() {
System.out.println("飞机出行");
}
@Override
public boolean match(BigDecimal price) {
if (price.compareTo(new BigDecimal("1000")) >= 0) {
return true;
}
return false;
}
}
// 单车出行
public class BicycleTravel implements TravelStrategy {
@Override
public void travel() {
System.out.println("单车出行");
}
@Override
public boolean match(BigDecimal price) {
if (price.compareTo(new BigDecimal("200")) < 0) {
return true;
}
return false;
}
}
// 火车出行
public class TrainTravel implements TravelStrategy {
@Override
public void travel() {
System.out.println("火车出行");
}
@Override
public boolean match(BigDecimal price) {
if (price.compareTo(new BigDecimal("200")) >= 0
&& price.compareTo(new BigDecimal("500")) <= 0) {
return true;
}
return false;
}
}
// 出行策略
public class Strategy {
private TravelStrategy travelStrategy;
private static List<TravelStrategy> list = new ArrayList<>();
// 可以根据实际需求,选择@PostConstruct 或者 static 两种初始化方式
// @PostConstruct
// private void init() {
// list.add(new AircraftTravel());
// list.add(new BicycleTravel());
// list.add(new TrainTravel());
// }
static {
list.add(new AircraftTravel());
list.add(new BicycleTravel());
list.add(new TrainTravel());
}
private void setTravelStrategy(TravelStrategy travelStrategy) {
this.travelStrategy = travelStrategy;
}
public void travelStyle(BigDecimal price) {
// 根据价格匹配,然后选择合适的出行方式
for (TravelStrategy strategy : list) {
if (strategy.match(price)) {
strategy.travel();
}
}
}
}
public static void main(String[] args) {
Strategy strategy = new Strategy();
// 只需传入价格,即可自动推荐合适的出行方式
strategy.travelStyle(new BigDecimal("500"));
}
优化if_else if _ esle 在这里运用到了两种策略模式的不同实现
- 第一种实现,已经确定需要哪种策略,然后直接选择
- 第二种实现,不确定会要哪种策略,根据特定条件匹配相应的策略
设计不是不是规范,也没有规定一定要这么写。 需要根据项目的实际需求和需要选择相应的实现。