0


Java是如何制作月饼的——制作、下单和售卖

前言

📫作者简介:小明Java问道之路,专注于研究计算机底层/Java/Liunx 内核,就职于大型金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的架构设计📫

🏆 CSDN专家博主/Java领域优质创作者、阿里云专家/签约博主、InfoQ签约博主、华为云专家、51CTO专家 🏆

🔥如果此文还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主~

本文导读

中秋节是中国民间的传统节日,中秋节源自天象崇拜由上古时代秋夕祭月演变而来。中秋节自古便有祭月、赏月、吃月饼等民俗,流传至今,经久不息。

说到月饼,我们现在吃的都是工厂、小作坊、自己家里制作,在电商平台售卖或者有一些营销活动赠送,我们来看看Java是怎么制作月饼的,我们是否可以在代码实现一个月饼售卖的架构设计和设计模式。

借此机会,我们用Lambda实现一遍月饼制作,下单,售卖的开发设计模式,主要有制作月饼的工厂模式、

一、使用工厂模式制作月饼

设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思维方式。使用工厂模式,我们就无需向消费者们暴露,我们的月饼(实例化月饼对象)的制作逻辑,就能完成月饼的制作。

1、使用工厂创建月饼实例

我们需要一个月饼工厂(MoonCakeFactory)或者叫月饼小作坊,在工厂里我们可以创建一个map 将产品名映射到对应的构造函数中,提供一个像工厂模式一样,利用map来实例化不同对象。

  1. /**
  2. * 一个简单的月饼制作工厂
  3. * @author XiaoMing
  4. */
  5. public class MoonCakeFactory {
  6. /**
  7. * 我们可以创建一个map 将产品名映射到对应的构造函数中
  8. */
  9. final static Map<String, Supplier<MoonCakeInfo>> map = new HashMap<>();
  10. static {
  11. // 五仁的,我的最爱
  12. map.put("wuRen", WuRenMoonCakeInfo::new);
  13. // 豆沙
  14. map.put("redBeanPaste", RedBeanPasteMoonCakeInfo::new);
  15. // 枣泥
  16. map.put("jujubePaste", JujubePasteMoonCakeInfo::new);
  17. // 蛋黄的
  18. map.put("eggYolk", EggYolkMoonCakeInfo::new);
  19. }
  20. /**
  21. * 像工厂模式一样,利用map来实例化不同对象
  22. *
  23. * @param moonCakeType 月饼类型
  24. */
  25. public static MoonCakeInfo createMoonCake(String moonCakeType) {
  26. // 获取月饼供应商
  27. Supplier<MoonCakeInfo> moonCakeInfoSupplier = map.get(moonCakeType);
  28. if (null != moonCakeInfoSupplier) {
  29. return moonCakeInfoSupplier.get();
  30. }
  31. throw new IllegalArgumentException("No such MoonCakeInfo" + moonCakeType);
  32. }
  33. }
  34. /**
  35. * @author XiaoMing
  36. */
  37. public class WuRenMoonCakeInfo extends MoonCakeInfo {
  38. private String wuRen;
  39. public String getWuRen() { return wuRen; }
  40. public void setWuRen(String wuRen) { this.wuRen = wuRen; }
  41. }

2、工厂模式剖析

现在我们就可以试着拿到对应的,实例化的月饼对象了

  1. WuRenMoonCakeInfo wuRen = (WuRenMoonCakeInfo) createMoonCake("wuRen");

我们看完了这个例子,现在思考内部的问题,这么做有什么好处?为什么createMoonCake是一个static的方法?

我们制作月饼有很多馅,除了馅我们还可以取对应馅(moonCakeType)的时候,就可以获取到一个实例化的对象,不需要我们在使用的地方创建,将工厂定义为静态方法是一个常用技巧,称为静态工厂,不需要创建方法来实例化对象,将实例化对象和创建方法解耦。

二、使用策略模式限制购买月饼类型

一个礼盒中有很多类型的月饼,有些馅并不我待见,博主曾经吃过一个咖啡馅月饼,这里面我们把奇奇怪怪的馅扣除去。校验是否为有效订单,设置该策略不允许咖啡馅月饼和榴莲馅的下单

策略模式可以理解为一种通过算法解决一类问题的通用方案,策略模式包括该算法的接口,一个或多个接口的实现逻辑,以及策略对象,下面我们用lambda表达式实现,Validator 相当于一个中转站,strategy.validatorOrder(orderType);可以通过下属lambda实现,也可以通过实现类,继承Strategy 接口实现

  1. /**
  2. * 假设为下单主流程
  3. * 我们主要关注 策略模式下订单类型的校验,这几个步骤
  4. */
  5. public void submitOrder(OrderInfo orderInfo) {
  6. // ...
  7. // 校验是否为有效订单,设置该策略不允许咖啡馅月饼和榴莲馅的下单
  8. Validator v1 = new Validator(orderType -> !orderType.equals("Coffee") || !orderType.equals("Durian"));
  9. v1.validatorOrder(orderInfo.getOrderType());
  10. // ...
  11. }
  12. /**
  13. * @author XiaoMing
  14. */
  15. public class Validator {
  16. private Strategy strategy;
  17. public Validator(Strategy strategy) {
  18. this.strategy = strategy;
  19. }
  20. public boolean validatorOrder(String orderType) {
  21. return strategy.validatorOrder(orderType);
  22. }
  23. }
  24. /**
  25. * @author XiaoMing
  26. */
  27. public interface Strategy {
  28. /**
  29. * 函数式接口,通过调用 Validator时实现
  30. */
  31. boolean validatorOrder(String orderType);
  32. }

三、模板方法模式设计月饼的优惠决策

我们购买月饼在电商业务中有很多优惠信息,例如红包、平台券、商家券、满减、秒杀活动等等, 如果每个优惠写一个方法那么就不方便阅读和管理,我们可以用这种方式将代码扩展性做的很好假设为下单主流程,我们主要关注 优惠决策与核销->优惠信息落库,这几个步骤。

1、使用模板方法实现优惠活动

让我们从模板方法模式设计月饼的优惠决策的例子着手,看看这个模式是如何工作的。

  1. /**
  2. * 假设为下单主流程
  3. * 我们主要关注 优惠决策与核销->优惠信息落库,这几个步骤
  4. */
  5. public void submitOrder(List<OrderInfo> orderList) {
  6. // ...
  7. // 优惠决策与核销
  8. writeOff(orderList, couponInfos -> {
  9. // 将优惠信息落库
  10. transaction(orderList);
  11. });
  12. // ...
  13. }
  14. /**
  15. * 我们购买月饼在,电商业务中有很多优惠信息,例如红包、平台券、商家券、满减、秒杀活动等等
  16. * 如果每个优惠写一个方法那么就不方便阅读和管理,我们可以用这种方式将代码扩展性做的很好
  17. */
  18. public void writeOff(List<OrderInfo> orderList, Consumer<List<CouponInfo>> consumer) {
  19. // 每个优惠信息,由自己的实现类实现
  20. List<CouponInfo> couponInfos = consume(orderList);
  21. // 此处将结果保存
  22. consumer.accept(couponInfos);
  23. }
  24. /**
  25. * 每个优惠信息自己实现 ServiceImpl
  26. */
  27. private List<CouponInfo> consume(List<OrderInfo> orderList) {
  28. List<CouponInfo> couponInfos = new ArrayList<>();
  29. // 核销后返回信息(实现业务逻辑)
  30. // ...
  31. return couponInfos;
  32. }
  33. /**
  34. * 将优惠信息落库
  35. */
  36. private static void transaction(List<OrderInfo> orderInfos) {
  37. }

2、模板方法剖析

模板方法模式,如果你需要采用某个算法的框架,同时又希望有一定的灵是活度,能对它的某些部分进行改进,那么采用模板方法设计模式是比较通用的方案。这样讲有些抽象。换句话说,模板方法模式在你希望使用这个算法,但是需要对其中的某些行进行改进,才能达到希望的效果时是非常有用的。

总结

借此中秋节机会,我们实现一个月饼售卖的设计模式。主要使用了Lambda和设计模式的思想,实现月饼制作的工厂模式,下单的策略模式校验,优惠券操作的模板方法模式的开发。


本文转载自: https://blog.csdn.net/FMC_WBL/article/details/126533844
版权归原作者 小明java问道之路 所有, 如有侵权,请联系我们删除。

“Java是如何制作月饼的&mdash;&mdash;制作、下单和售卖”的评论:

还没有评论