本文由 简悦 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==