当前位置: 首页 > wzjs >正文

长春网站开发senluowx苏州网站建设介绍

长春网站开发senluowx,苏州网站建设介绍,青岛网站优化多少钱,网站做自签发证书DDD 是一套 应对复杂业务系统 的设计方法论,核心是 让代码直接映射业务逻辑,避免技术实现与业务需求脱节。 关键区别: 传统开发:根据数据库表写 CRUD(技术驱动)。DDD:根据业务行为建模&#xf…

DDD 是一套 应对复杂业务系统 的设计方法论,核心是 让代码直接映射业务逻辑,避免技术实现与业务需求脱节。
关键区别

  • 传统开发:根据数据库表写 CRUD(技术驱动)。
  • DDD:根据业务行为建模(业务驱动)。

举例

  • 传统方式:设计 orders 表 → 写 OrderDAO → 实现增删改查。
  • DDD 方式:先分析业务如何描述“订单”(如“下单”、“取消”、“支付超时”)→ 再建模为 Order 对象的行为。

贫血模型与充血模型

本质特征

特征贫血模型充血模型
业务逻辑存放位置Service层领域对象(Entity/Value Object)内部
领域对象职责仅作为数据载体(DTO)封装数据和行为
代码表现大量Getter/Setter,无业务方法包含业务方法
适用场景简单CRUD系统复杂业务系统(DDD推荐)

代码实现对比

贫血模型实现

  • Order 只是数据的容器,业务逻辑散落在 Service 中。
  • 当业务复杂时,Service 会变成“上帝类”(God Class)。
// 1. 贫血的Order类(仅有数据)
public class Order {private String orderId;private String productId;private int quantity;private String status;// 只有Getter/Setter,无业务逻辑public String getOrderId() { return orderId; }public void setOrderId(String orderId) { this.orderId = orderId; }// 其他Getter/Setter省略...
}// 2. 业务逻辑全在Service中
@Service
public class OrderService {public void createOrder(String productId, int quantity) {Order order = new Order();order.setOrderId(UUID.randomUUID().toString());order.setProductId(productId);order.setQuantity(quantity);order.setStatus("CREATED");// 校验逻辑也在Service中if (quantity <= 0) {throw new IllegalArgumentException("Quantity must be positive");}orderRepository.save(order);}
}

充血模型实现

  • Order 自己负责业务规则(如创建校验、状态转换)。
  • 业务逻辑高内聚,Service层变薄。
// 1. 充血的Order类(封装数据和行为)
public class Order {private String orderId;private String productId;private int quantity;private OrderStatus status; // 枚举// 私有构造方法,强制通过工厂方法创建private Order(String productId, int quantity) {this.orderId = UUID.randomUUID().toString();this.productId = productId;this.quantity = quantity;this.status = OrderStatus.CREATED;}// 静态工厂方法(封装创建逻辑)public static Order create(String productId, int quantity) {if (quantity <= 0) {throw new IllegalArgumentException("Quantity must be positive");}return new Order(productId, quantity);}// 领域行为public void cancel() {if (this.status == OrderStatus.PAID) {throw new IllegalStateException("Paid order cannot be cancelled");}this.status = OrderStatus.CANCELLED;}
}// 2. 应用层Service(仅协调流程)
@Service
public class OrderAppService {public void createOrder(String productId, int quantity) {Order order = Order.create(productId, quantity); // 调用领域对象orderRepository.save(order);}
}

DDD实战

架构图

架构设计

src/
├── presentation/    # 用户接口层
├── application/     # 应用层
├── domain/          # 领域层
│   ├── model/       # 领域模型(实体、值对象等)
│   └── repository/  # 仓储接口
└── infrastructure/  # 基础设施层(简单实现)

代码示例

(1) 用户接口层(Presentation Layer)

处理HTTP请求,接收用户输入。

// presentation/OrderController.java
@RestController
@RequestMapping("/orders")
public class OrderController {private final OrderAppService orderAppService; // 依赖应用层@PostMappingpublic ResponseEntity<String> createOrder(@RequestBody CreateOrderRequest request) {orderAppService.createOrder(request.toCommand()); // 转换为命令对象return ResponseEntity.ok("Order created");}
}// DTO:用户请求参数
public class CreateOrderRequest {private String productId;private int quantity;// 转换为应用层命令对象public CreateOrderCommand toCommand() {return new CreateOrderCommand(productId, quantity);}
}

(2) 应用层(Application Layer)

协调领域对象完成用例,不包含业务逻辑

// application/OrderAppService.java
@Service
public class OrderAppService {private final OrderRepository orderRepository; // 依赖领域层仓储public void createOrder(CreateOrderCommand command) {// 1. 调用领域层创建订单Order order = Order.create(command.getProductId(), command.getQuantity());// 2. 通过仓储保存聚合根orderRepository.save(order);// 3. 可发布领域事件(此处省略)}
}// 应用层命令对象
public class CreateOrderCommand {private String productId;private int quantity;// 构造方法、getter省略...
}

(3) 领域层(Domain Layer)

核心业务逻辑,包含实体、值对象、仓储接口等。

3.1 实体(Entity)与聚合根
// domain/model/Order.java
public class Order {private String orderId;      // 唯一标识private String productId;private int quantity;private OrderStatus status;  // 枚举:CREATED, PAID, CANCELLED等// 私有构造方法,强制通过工厂方法创建private Order(String productId, int quantity) {this.orderId = UUID.randomUUID().toString();this.productId = productId;this.quantity = quantity;this.status = OrderStatus.CREATED;}// 工厂方法(封装创建逻辑)public static Order create(String productId, int quantity) {if (quantity <= 0) {throw new IllegalArgumentException("Quantity must be positive");}return new Order(productId, quantity);}// 领域行为public void cancel() {this.status = OrderStatus.CANCELLED;}
}
3.2 仓储接口(Repository)
// domain/repository/OrderRepository.java
public interface OrderRepository {void save(Order order);// 其他查询方法省略...
}

(4) 基础设施层(Infrastructure Layer)

实现领域层定义的仓储接口(如数据库操作)。

// infrastructure/persistence/OrderRepositoryImpl.java
@Repository
public class OrderRepositoryImpl implements OrderRepository {// 模拟数据库(实际可用JPA/MyBatis等)private Map<String, Order> orders = new HashMap<>();@Overridepublic void save(Order order) {orders.put(order.getOrderId(), order);System.out.println("Order saved: " + order.getOrderId());}
}

调用流程图

对比传统CRUD

DDD传统CRUD
先设计Order的行为方法直接操作orders
业务逻辑在领域层业务逻辑散落在Service中
通过聚合根保证一致性需手动校验外键约束

充血模型特点

  1. 禁止Setter:通过构造方法或工厂方法创建对象。
  2. 领域方法命名:使用业务语言(如 cancel() 而非 setStatus("CANCELLED"))。
  3. 避免“贫血”的充血模型
    • 错误示例:在 Order 中加了方法,但核心逻辑仍在Service中。

常见误区

  • ❌ 认为充血模型等于“把所有代码塞进Entity”
    • 跨聚合逻辑应放在领域服务(Domain Service)中。
  • ❌ 忽视聚合根的一致性边界
    • 例如订单和库存属于不同聚合,不能直接在 Order 中修改库存,应通过领域事件解耦。


文章转载自:

http://sBsXEef7.hxbjt.cn
http://x4tIbA32.hxbjt.cn
http://W4Xtv4Bc.hxbjt.cn
http://9HkWrM5r.hxbjt.cn
http://H3jY3Zr3.hxbjt.cn
http://DWjBJlLK.hxbjt.cn
http://PkVXjeCj.hxbjt.cn
http://OhF0Xwgg.hxbjt.cn
http://B7IKENQi.hxbjt.cn
http://s4r9xZtd.hxbjt.cn
http://VeZJZwmA.hxbjt.cn
http://V7e3EWMl.hxbjt.cn
http://P8FmV3B5.hxbjt.cn
http://atzIT1i9.hxbjt.cn
http://DAHL9wlc.hxbjt.cn
http://VHyyPULX.hxbjt.cn
http://OhM2OI9o.hxbjt.cn
http://FDZiin5t.hxbjt.cn
http://TqJFtznN.hxbjt.cn
http://u7c41rVk.hxbjt.cn
http://2jbkBQnP.hxbjt.cn
http://ngHelkwm.hxbjt.cn
http://8nAh9gNe.hxbjt.cn
http://0p009qcR.hxbjt.cn
http://VYZTCFYH.hxbjt.cn
http://34aGS9CR.hxbjt.cn
http://sNU2hVgv.hxbjt.cn
http://d1j26X8V.hxbjt.cn
http://6Mr2xd0i.hxbjt.cn
http://hGraJzAU.hxbjt.cn
http://www.dtcms.com/wzjs/689701.html

相关文章:

  • 建立网站 费用wordpress公众号涨粉
  • 网站提示页面设计个人网站建设月租抵30元
  • 网站 建设 成品秦皇岛 网站制作
  • 企业建立网站的目的网站关键字如何选择
  • 泸州做网站公司邯郸单位网站建设
  • 常德网站建设多少钱摄影网站模板源码
  • 电商网站定制开发破洛洛wordpress
  • 鄞州区网站建设报价中国建设执业资格注册管理中心网站
  • 广州建站哪个济南兴田德润实惠吗中级经济师考试公告
  • 下载类网站 前置备案网站后期维护和管理怎么做
  • 网站设计规划思路阿里云怎么搭载wordpress
  • 山东兴润建设有限公司网站ui网页设计课程
  • mixkitcom素材网站微信公众号小程序怎么创建
  • 广州天河 网站建设淘宝做基础销量怎么网站
  • 上海网站开发建设找哪家网络广告公司排名
  • 建设网站服务手机版网站开发的功能点
  • 工商注册网站网页设计实训报告总结与体会
  • 如何做计算机网站什么是seo
  • 网站首页设计原则网页版
  • 潍坊行业网站西安注册公司流程
  • 免费空间域名可以做淘宝客网站推广吗建筑工程考试题库
  • 杭州网站制作 乐云践新去哪里找需要推广的app
  • 建设学校网站论文网站赚取广告费
  • 建网站的8个详细步骤哪些公司做网站比较好
  • 网站推广优化排名公司制作ppt的软件手机版免费
  • 可视化的做网站的app网站红色搭配
  • 个人政务公开网站建设工作总结安卓手机app开发工具软件
  • 宁波专业建网站外包建电影网站
  • 网站手机版排名seo软件开发专业技能
  • 安徽网站建设seo优化网站设计模板免费