Skip to content

本文由 简悦 SimpRead 转码, 原文地址 www.bilibili.com

需求简述 为了简化理解业务、对象、数据之间的关系,下面我们以商品下单功能举例说明:需求描述 用户将购物车选择的商品,点击支付然后完成下单,商品下单以后需要通知商家接单。

需求简述

为了简化理解业务、对象、数据之间的关系,下面我们以商品下单功能举例说明:

需求描述

用户将购物车选择的商品,点击支付然后完成下单,商品下单以后需要通知商家接单。

功能要求:

用户:

下单

支付

查看订单状态

查看订单详情

商家:

订单列表

待接单列表

接单

发货

平台:

订单列表

用户列表

商家列表

订单统计

当日订单总数

总支付金额

哪些是业务,哪些是功能,哪些是通过模型完成的,哪些是通过数据完成的。

如下的功能将会涉及到业务模型:

下单、支付、接单、发货

如下的功能只是涉及到数据:

查看订单状态、查看订单详情、订单列表、商家列表、订单统计

关系介绍

![][img-0]

功能包含了 业务功能与数据功能

业务功能是由业务模型参与完成的

业务模型的参与过程中产生数据

代码演示

![][img-1]

代码演示

业务对象代码

import lombok.Getter;
import lombok.Setter;

@Setter
@Getter
public class Bill {

    private String billNo;
    private int money;
    private long timestamp;
    private Order order;
    private User user;


    public Bill(Order order, User user) {
        this.billNo = String.format("NO%s",System.currentTimeMillis());
        this.order = order;
        this.user = user;
        this.timestamp = System.currentTimeMillis();
    }
}


import lombok.Getter;
import lombok.Setter;

@Setter
@Getter
public class Merchant {

    private long id;
    private String name;

    public Merchant(String name) {
        this.name = name;
        this.id = System.currentTimeMillis();
    }
}

import com.codingapi.crankycode.event.OrderPayEvent;
import com.codingapi.springboot.framework.event.EventPusher;
import lombok.Getter;
import lombok.Setter;

import java.util.List;

@Setter
@Getter
public class Order {

    private final User user;

    private final long createTime;

    private final List<Product> products;

    private State state;


    public enum State{
        CREATE,PAYED,
    }

    public Order(User user, List<Product> products) {
        this.user = user;
        this.products = products;
        this.createTime = System.currentTimeMillis();

        this.verify();
    }


    private void verify(){
        if(user==null){
            throw new RuntimeException("user must not null.");
        }
        if(products==null||products.size()==0){
            throw new RuntimeException("products must not null.");
        }
    }


    public void pay(){
        state = State.PAYED;
        EventPusher.push(new OrderPayEvent(this));
    }

}

import lombok.Getter;
import lombok.Setter;

@Setter
@Getter
public class Product {

    private long id;
    private String name;
    private Merchant merchant;

    public Product(String name, Merchant merchant) {
        this.name = name;
        this.merchant = merchant;
        this.id = System.currentTimeMillis();
    }
}

import lombok.Getter;
import lombok.Setter;

@Setter
@Getter
public class User {

    private String username;
    private String password;

    public User(String username) {
        this.username = username;
    }
}

业务场景代码

import com.codingapi.crankycode.command.OrderCommand;
import com.codingapi.crankycode.domain.Order;
import com.codingapi.crankycode.domain.Product;
import com.codingapi.crankycode.domain.User;
import com.codingapi.crankycode.repository.ProductRepository;
import com.codingapi.crankycode.repository.UserRepository;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
@AllArgsConstructor
public class OrderExecutor {

    private final UserRepository userRepository;
    private final ProductRepository productRepository;


    public void createOrder(OrderCommand.CreateCommand command){
        User user = userRepository.getUserByName(command.getUsername());
        Product product = productRepository.getProductByName(command.getProductName());
        Order order = new Order(user, List.of(product));
        order.pay();
    }

}

执行日志:

2023-06-08T12:29:09.352+08:00  INFO 9031 --- [           main] c.c.c.handler.OrderPayBillHandler        : order pay event:com.codingapi.crankycode.event.OrderPayEvent@7a1b8a46
2023-06-08T12:29:09.353+08:00  INFO 9031 --- [           main] c.c.c.r.impl.BillRepositoryImpl          : save bill==>com.codingapi.crankycode.domain.Bill@59fc6d05

代码地址:

https://github.com/codingapi/cranky-code/tree/main/demo3.1

[img-0]:data:text/plain;base64,dW5rbm93biBwYXJhbXM6IHdlYi1hcnRpY2xlLXBpYw==

[img-1]:data:text/plain;base64,dW5rbm93biBwYXJhbXM6IHdlYi1hcnRpY2xlLXBpYw==

Released under the MIT License.