首页 > 其他分享 >订单设计步骤

订单设计步骤

时间:2023-03-31 20:33:27浏览次数:49  
标签:BigDecimal 步骤 order 订单 OrderService 设计 Order public

本文由 简悦 SimpRead 转码, 原文地址 chat8.io

场景: 假设你是 Java 架构师 使用设计模式 实现一个订单下单过程

好的,假设我是一名 Java 架构师,使用设计模式实现一个订单下单过程,可以使用工厂模式和模板方法模式进行设计。下面是一个可能的实现:

首先,我们需要定义一个订单类 Order,包含订单信息和商品信息。如下:

public class Order {
    private String orderId;
    private String userId;
    private List<Item> items;
    private BigDecimal totalPrice;

    public Order(String orderId, String userId, List<Item> items, BigDecimal totalPrice) {
        this.orderId = orderId;
        this.userId = userId;
        this.items = items;
        this.totalPrice = totalPrice;
    }

    // getter and setter
}


其中,Item 为商品信息类,包含商品名称、数量和单价等信息。

然后,我们定义一个下单服务接口 OrderService,其中包含下单过程的抽象方法 submitOrder() 和具体实现方法 calculateTotalPrice()。如下:

public interface OrderService {
    void submitOrder(Order order);

    BigDecimal calculateTotalPrice(List<Item> items);
}


接着,我们通过使用工厂模式创建一个订单服务工厂类,实现创建不同类型订单服务。如下:

public class OrderServiceFactory {
    public static OrderService createOrderService(String orderType) {
        if ("normal".equals(orderType)) {
            return new NormalOrderService();
        } else if ("vip".equals(orderType)) {
            return new VipOrderService();
        } else {
            throw new UnsupportedOperationException("Unsupported order type: " + orderType);
        }
    }
}


其中,NormalOrderService 和 VipOrderService 分别实现了 OrderService 接口,并实现了 calculateTotalPrice() 和 submitOrder() 方法。

接下来,我们定义一个模板方法 OrderTemplate,它包含订单处理的流程,以及调用子类实现的具体方法。如下:

public abstract class OrderTemplate implements OrderService {
    @Override
    public void submitOrder(Order order) {
        // 1. 计算订单总价
        BigDecimal totalPrice = calculateTotalPrice(order.getItems());
        order.setTotalPrice(totalPrice);
        // 2. 处理订单信息
        processOrder(order);
        // 3. 将订单信息保存到数据库中
        saveOrder(order);
    }

    protected abstract void processOrder(Order order);

    protected void saveOrder(Order order) {
        System.out.println("订单保存成功: " + order);
    }
}


注意到 OrderTemplate 是一个抽象类,它实现了 submitOrder() 方法,并定义了 processOrder() 方法和 saveOrder() 方法。processOrder() 方法交由子类来具体实现。

最后,我们可以定义具体的订单服务类,继承自 OrderTemplate 类,实现 processOrder() 方法。如下:

public class NormalOrderService extends OrderTemplate {
    @Override
    protected void processOrder(Order order) {
        System.out.println("正在处理普通订单: " + order);
        // 处理具体的业务逻辑
    }

    @Override
    public BigDecimal calculateTotalPrice(List<Item> items) {
        // 计算订单总价
        return items.stream().map(item -> item.getPrice().multiply(new BigDecimal(item.getQuantity()))).reduce(BigDecimal.ZERO, BigDecimal::add);
    }
}


在上述代码中,NormalOrderService 类继承自 OrderTemplate 类,并实现了 processOrder() 方法和 calculateTotalPrice() 方法。processOrder() 方法用于实现具体的业务逻辑,calculateTotalPrice() 方法用于计算订单总价。

通过上述的设计,我们使用工厂模式和模板方法模式,实现了一个订单下单过程,可以根据不同的订单类型来创建具体的订单服务类,并实现订单处理的流程,将各个环节分解出来,使得代码易于维护和扩展。

t

假设你是 Java 架构师 使用设计模式 实现一个订单下单过程 使用 markdown 格式输出

好的,假设我是一名 Java 架构师,使用设计模式实现一个订单下单过程。下面是一个可能的实现:

Order 类

首先,我们需要定义一个订单类 Order,包含订单信息和商品信息。

public class Order {
    private String orderId;
    private String userId;
    private List<Item> items;
    private BigDecimal totalPrice;

    public Order(String orderId, String userId, List<Item> items, BigDecimal totalPrice) {
        this.orderId = orderId;
        this.userId = userId;
        this.items = items;
        this.totalPrice = totalPrice;
    }

    // getter and setter
}


其中,Item 为商品信息类,包含商品名称、数量和单价等信息。

OrderService 接口

然后,我们定义一个下单服务接口 OrderService,其中包含下单过程的抽象方法 submitOrder() 和具体实现方法 calculateTotalPrice()

public interface OrderService {
    void submitOrder(Order order);
    BigDecimal calculateTotalPrice(List<Item> items);
}


OrderServiceFactory 类

接着,我们通过使用工厂模式创建一个订单服务工厂类 OrderServiceFactory,实现创建不同类型订单服务。

public class OrderServiceFactory {
    public static OrderService createOrderService(String orderType) {
        if ("normal".equals(orderType)) {
            return new NormalOrderService();
        } else if ("vip".equals(orderType)) {
            return new VipOrderService();
        } else {
            throw new UnsupportedOperationException("Unsupported order type: " + orderType);
        }
    }
}


其中,NormalOrderServiceVipOrderService 分别实现了 OrderService 接口,并实现了 calculateTotalPrice()submitOrder() 方法。

OrderTemplate 抽象类

接下来,我们定义一个模板方法 OrderTemplate,它包含订单处理的流程,以及调用子类实现的具体方法。

public abstract class OrderTemplate implements OrderService {
    @Override
    public void submitOrder(Order order) {
        // 1. 计算订单总价
        BigDecimal totalPrice = calculateTotalPrice(order.getItems());
        order.setTotalPrice(totalPrice);
        // 2. 处理订单信息
        processOrder(order);
        // 3. 将订单信息保存到数据库中
        saveOrder(order);
    }

    protected abstract void processOrder(Order order);

    protected void saveOrder(Order order) {
        System.out.println("订单保存成功: " + order);
    }
}


注意到 OrderTemplate 是一个抽象类,它实现了 submitOrder() 方法,并定义了 processOrder() 方法和 saveOrder() 方法。processOrder() 方法交由子类来具体实现。

具体订单服务类

最后,我们可以定义具体的订单服务类,继承自 OrderTemplate 类,实现 processOrder() 方法。

public class NormalOrderService extends OrderTemplate {
    @Override
    protected void processOrder(Order order) {
        System.out.println("正在处理普通订单: " + order);
        // 处理具体的业务逻辑
    }

    @Override
    public BigDecimal calculateTotalPrice(List<Item> items) {
        // 计算订单总价
        return items.stream().map(item -> item.getPrice().multiply(new BigDecimal(item.getQuantity()))).reduce(BigDecimal.ZERO, BigDecimal::add);
    }
}


在上述代码中,NormalOrderService 类继承自 OrderTemplate 类,并实现了 processOrder() 方法和 calculateTotalPrice() 方法。processOrder() 方法用于实现具体的业务逻辑,`calculateTotalPrice

t

请继续完成上面的后续部分

() 方法用于计算订单总价。

通过上述的设计,我们使用工厂模式和模板方法模式,实现了一个订单下单过程,可以根据不同的订单类型来创建具体的订单服务类,并实现订单处理的流程,将各个环节分解出来,使得代码易于维护和扩展。

此外,我们还可以通过使用单例模式来确保 OrderServiceOrderServiceFactory 的唯一实例,并使用适当的设计模式来实现数据库操作、日志记录等功能。这里只是提供了一种基于工厂模式和模板方法模式的简单实现,实际应用中需要根据具体的业务需求进行进一步的设计。

总之,在设计软件系统时,使用适当的设计模式可以简化代码结构和提高代码的可维护性,我们应该根据具体的业务需求选择合适的设计模式来实现软件功能。

t

接着上面的设计 我们来具体细化一下 加入促销手段对订单过程的影响 继续完成上面的设计代码

好的,接下来我们针对上一份设计方案进行细化,加入促销手段,对订单过程进行改进。

PromotionService 接口

首先,我们定义一个促销服务接口 PromotionService,其中包含一个方法 calculateDiscount() 用于计算优惠金额。

public interface PromotionService {
    BigDecimal calculateDiscount(Order order);
}


DiscountPromotionService 类

我们通过使用策略模式和工厂模式创建一个折扣促销服务 DiscountPromotionService,实现根据不同的促销类型进行不同的促销操作。

public class DiscountPromotionService implements PromotionService {
    private PromotionType promotionType;

    public DiscountPromotionService(PromotionType promotionType) {
        this.promotionType = promotionType;
    }

    @Override
    public BigDecimal calculateDiscount(Order order) {
        switch (promotionType) {
            case PERCENT_OFF:
                return order.getTotalPrice()
                            .multiply(BigDecimal.valueOf(promotionType.getDiscount()))
                            .setScale(2, RoundingMode.HALF_UP);
            case CASH_BACK:
                return BigDecimal.valueOf(promotionType.getDiscount());
            default:
                throw new IllegalArgumentException("Unsupported promotion type: " + promotionType.name());
        }
    }
}


其中,PromotionType 是枚举类型,包含了两种促销类型:打折和返现。DiscountPromotionService 类实现了 PromotionService 接口,根据传入的 PromotionType 进行不同的计算返回不同的优惠额度。

OrderServiceWithPromotion 类

接下来,我们通过使用装饰器模式来封装订单服务,实现具有促销功能的订单服务类 OrderServiceWithPromotion

public class OrderServiceWithPromotion implements OrderService {
    private OrderService orderService;
    private PromotionService promotionService;

    public OrderServiceWithPromotion(OrderService orderService, PromotionService promotionService) {
        this.orderService = orderService;
        this.promotionService = promotionService;
    }

    @Override
    public void submitOrder(Order order) {
        // 1. 计算订单总价
        BigDecimal totalPrice = orderService.calculateTotalPrice(order.getItems());
        order.setTotalPrice(totalPrice);
        // 2. 计算促销优惠金额
        BigDecimal discount = promotionService.calculateDiscount(order);
        order.setDiscount(discount);
        // 3. 处理订单信息
        orderService.processOrder(order);
        // 4. 将订单信息保存到数据库中
        orderService.saveOrder(order);
    }

    @Override
    public BigDecimal calculateTotalPrice(List<Item> items) {
        return orderService.calculateTotalPrice(items);
    }
}


其中,OrderServiceWithPromotion 类实现了 OrderService 接口,并使用了订单服务类 orderServicecalculateTotalPrice()processOrder()saveOrder() 方法,同时引入促销服务 promotionService 来计算促销优惠金额。

使用示例

最后,我们可以创建一个使用示例,使用构建者模式来构建一个订单服务类 OrderServiceBuilder

public class OrderServiceBuilder {
    private OrderService orderService;
    private PromotionService promotion

t

继续完成上面的后续代码

Service;

public static OrderServiceBuilder newBuilder() {
    return new OrderServiceBuilder();
}

public OrderServiceBuilder withOrderService(OrderService orderService) {
    this.orderService = orderService;
    return this;
}

public OrderServiceBuilder withPromotionService(PromotionService promotionService) {
    this.promotionService = promotionService;
    return this;
}

public OrderService build() {
    return new OrderServiceWithPromotion(orderService, promotionService);
}


}

在使用示例中,我们可以根据具体的业务需求,选取或创建不同类型的订单服务和促销服务,并使用构建者模式创建一个包含促销功能的订单服务类。

```java
public class Example {
    public static void main(String[] args) {
        // 创建订单
        Order order = new Order("001", "1001",
                Arrays.asList(new Item("item1", 1, BigDecimal.valueOf(100))),
                null);

        // 创建订单服务
        OrderService orderService =
                OrderServiceBuilder.newBuilder()
                        .withOrderService(new NormalOrderService())
                        .withPromotionService(new DiscountPromotionService(PromotionType.PERCENT_OFF))
                        .build();

        // 提交订单
        orderService.submitOrder(order);

        // 输出订单信息
        System.out.println("订单总价: " + order.getTotalPrice());
        System.out.println("促销优惠金额: " + order.getDiscount());
        System.out.println("实际支付金额: " + order.getTotalPrice().subtract(order.getDiscount()));

        // 输出订单详细信息
        System.out.println("订单详细信息:" + order);
    }
}


通过这样的设计,我们实现了一个具有促销功能的订单下单过程,并同时使用了工厂模式、模板方法模式、策略模式、装饰器模式和构建者模式等多种设计模式,使得代码易于维护和扩展。

Curently using gpt-3.5-turbo model to improve AI interaction, aiming for naturalness and security.

标签:BigDecimal,步骤,order,订单,OrderService,设计,Order,public
From: https://www.cnblogs.com/xmanblue/p/17277414.html

相关文章

  • 软件构造规约设计知识点总结
    已经开始做软件构造实验二了,但做了几天还是感觉不太对,有种无从下手的感觉,我还是来复习一下本次实验所要用到的知识点吧,至于前面的知识呢,先别急,虽然也用的上,但在本次实验不是重点,之后再进行复习。知识点概要:规约设计测试用例ADT的泛化型ADT的抽象函数(AF)、......
  • office软件2016安装步骤office全版本软件安装包(win+mac版本)
    Office是一个强大的办公软件套件,包括Word、Excel、PowerPoint、OneNote等多个应用程序。office全版本软件安装包(win+mac版本)+全版本教程如下(极度详细):ruanjianduo.top Simplenote是一个简单、易用的笔记应用程序。它们结合起来可以提高工作效率,让你更方便地记录、共享......
  • 避免在PCB设计中出现电磁问题的7个技巧
    在PCB设计中,经常出现电磁问题,如何有效避免呢,有以下七个小技巧。技巧1:将PCB接地,这样可以减少发射、串扰和噪声。技巧2:区分EMI,由于EMI不同,一个很好的EMC设计规则是将模拟电路和数字电路分开。技巧3:串扰和走线是重点,走线对确保电流的正常流动特别重要,返回路径走线的长度应与发送走......
  • 网络时钟同步设备(NTP时间同步服务器)技术设计应用方案
    网络时钟同步设备(NTP时间同步服务器)技术设计应用方案网络时钟同步设备(NTP时间同步服务器)技术设计应用方案京准电子科技官微——ahjzsz网络时钟系统,顾名思义就是由1/2套母钟和一群子钟组成。如果你选择了安徽京准公司的HR系列时钟系统产品,那么所有的系统设计将会变得非常简单: ......
  • 重学Java设计模式-结构型模式-享元模式
    重学Java设计模式-结构型模式-享元模式内容摘自:https://bugstack.cn/md/develop/design-pattern/2020-06-14-重学Java设计模式《实战享元模式》.html#重学-java-设计模式-实战享元模式「基于redis秒杀-提供活动与库存信息查询场景」享元模式介绍图片来自:https://refactorin......
  • Visual Studio创建.net 6的WinForm一直提示"正在加载设计器"
    用VS创建.net6的WinForm,一直停留在"正在加载设计器"的界面*其实不止.net6,也能解决其它非.netframework的WinForm状况 原因1.删除了本地的安装缓存(VS安装时会把安装文件先下载到本地)2.关闭了或没打开NuGet 解决方法1.VS菜单->工具->选项->NuGet包管理器->程......
  • CAD命令行怎么恢复到初始状态?CAD命令行窗口恢复步骤
    CAD制图过程中,为了提高绘图效率经常会用到各种命令,很多命令信息及操作提示会在CAD命令行中显示。可当不小心改变了命令行的状态时,该怎么办呢?下面就和小编来了解一下CAD命令行怎么恢复到初始状态吧!CAD命令行窗口恢复初始步骤:1、启动浩辰CAD软件后,调用OP命令,即可打开【选项】对话......
  • CAD如何测量连续线段长度?CAD测量连续线段长度步骤
    在CAD绘图过程中,经常会绘制一些连续的线段,如果想要知道这些连续线段长度的话,该怎么操作吗?CAD如何测量连续线段长度?下面小编就以浩辰CAD软件为例来给大家分享一下CAD测量连续线段长度的具体操作步骤吧!CAD测量连续线段长度步骤:浩辰CAD软件中已经考虑到了这种需求,在CAD测量命令(DIST......
  • revit专用卸载工具,完全彻底卸载删除干净revit各种残留注册表和文件的方法和步骤。
    revit专用卸载工具,完全彻底卸载删除干净revit各种残留注册表和文件的方法和步骤。如何卸载revit呢?有很多同学想把revit卸载后重新安装,但是发现revit安装到一半就失败了或者显示revit已安装或者安装未完成,大多数情况下其实是revit没有被卸载干净。还有的同学会遇到安装错误1625,然后......
  • 审批流程设计
    CREATETABLEd_approve_workflow_config(workflow_cdVARCHAR(20)NOTNULLCOMMENT'流程cd:对应的审批流程',current_levelINT(11)NOTNULLCOMMENT'当前待审批级别',next_levelINT(11)DEFAULTNULLCOMMENT'审批后的级别:该字段为空时,表示审批流程完成',agr......