java设计模式之策略模式(二)
之前的博文中使用一个订单价格根据用户类型进行打折计算总价的例子来展示的策略模式。
其实策略本身就是一种计算方式,这种场景最适合使用函数式编程。
接下来我们就利用函数式编程重构一下上一篇《java设计模式之策略模式》中的案例。
首先定义一个用户枚举类型,不同的类型有不同的打折模式。
注意我们的枚举括号内的参数,不再是一个类,而是变成了一个纯函数。它接受一个Double类型,并返回另一个Double类型。
public enum CustomerType { COMMON(origin -> origin), MEMBER(origin -> 0.9 * origin), VIP(origin -> 0.8 * origin); private final DoubleFunction<Double> strategy; CustomerType(DoubleFunction<Double> strategy) { this.strategy = strategy; } public DoubleFunction<Double> getStrategy() { return strategy; } }
订单类
@Data public class Order { private double amount; private CustomerType customerType; /** * 计算总价 * @param originPrice 原生价格 * @param strategy 折扣策略 * @return 折扣后价格 */ Double calculatePrice(Double originPrice, DoubleFunction<Double> strategy) { return strategy.apply(originPrice); } }
简化后的订单类很简单,只包含两个属性,一个是订单总价,另一个是订单对应的用户类型。
只有一个方法,calculatePrice,用了计算订单总价。
方法实现也很简单,这就是函数式编程的魅力所在。
个人函数式编程的核心不在于函数本身,毕竟面向对象中到处都有函数,而是在于函数可以作为一个一级对象存在,可以是另一个函数的参数。