设计模式之策略模式实战

以出行为例实现策略模式

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 在这里运用到了两种策略模式的不同实现

  1. 第一种实现,已经确定需要哪种策略,然后直接选择
  2. 第二种实现,不确定会要哪种策略,根据特定条件匹配相应的策略

设计不是不是规范,也没有规定一定要这么写。 需要根据项目的实际需求和需要选择相应的实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值