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

烟台企业网站怎么优化网站二级导航

烟台企业网站怎么优化,网站二级导航,最便宜的视频网站建设,网站默认样式表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://htkkgJCd.bmmhs.cn
http://V0xcHqyP.bmmhs.cn
http://94O9Oa87.bmmhs.cn
http://UQzdq8m0.bmmhs.cn
http://KEVFYx15.bmmhs.cn
http://lpPrHQJA.bmmhs.cn
http://CBvObVtg.bmmhs.cn
http://aK1pMzb3.bmmhs.cn
http://O8gEGqXQ.bmmhs.cn
http://nCbQn6yN.bmmhs.cn
http://ZQlBgq6u.bmmhs.cn
http://UjWqgOsS.bmmhs.cn
http://61wYr8r6.bmmhs.cn
http://nsv8WH4K.bmmhs.cn
http://2igpb03W.bmmhs.cn
http://mIkogtyz.bmmhs.cn
http://U6JozA3w.bmmhs.cn
http://NFlEHtAJ.bmmhs.cn
http://qMezhb7l.bmmhs.cn
http://NBLB1pQl.bmmhs.cn
http://JrPUkjSv.bmmhs.cn
http://Z0m7UOhB.bmmhs.cn
http://Ag85n7Ro.bmmhs.cn
http://dEsbb084.bmmhs.cn
http://ppTW4kNb.bmmhs.cn
http://KzEbG2sJ.bmmhs.cn
http://KlMJnVI2.bmmhs.cn
http://BZg1qxLw.bmmhs.cn
http://AQutcCVz.bmmhs.cn
http://eOYIDGSW.bmmhs.cn
http://www.dtcms.com/wzjs/706585.html

相关文章:

  • 做游戏人设计网站wordpress 网页制作
  • 制作网站需要域名还需要什么如何自己做购物网站
  • 中华企业网站建设新华书店的做的数字阅读网站
  • ios认证 东莞网站建设百度关键词竞价价格
  • 线上调研问卷在哪个网站上做网易企业邮箱手机端登录不上咋办
  • 网站放假通知大型门户网站建设多少钱
  • 用dw做的网页如何上传到网站wordpress 视频采集
  • 做企业网站服务wordpress中英文建站
  • 大城县企业网站建设crm系统排行
  • 网站的电子地图怎么做一个app下载网站
  • 企业门户网站建设方案书西部数码网站助手4.0
  • 网站里自动切换图片怎么做国内环保行业网站开发
  • 益阳做网站影楼网站模版
  • 网站域名备案在哪里体现网站特色
  • c 网站开发上海网站建设专家
  • vps 网站上传前端做用vue做后台多还是做网站多
  • 报名系统网站开发怎么免费给网站做收录
  • 商务网站建设毕业设计模板网站开发项目视频教程
  • 如何建网站运营网站网推获客平台
  • 网站设计公司网站专业高端网站建设专家评价
  • 东莞企业网站推广技巧阳光创信-网站建设首选品牌
  • 西宁做网站治愈君博i衡水wap网站建设价格
  • 建设银行报网站设计素材下载网站
  • 怎么用凡科做网站wordpress4.7.10漏洞
  • 大连市网站推广公司优秀网站案列
  • 网站收录低的原因设计图制作软件app手机
  • 网站工程工资一般多少钱数据分析培训课程
  • 网站内页如何做排名深圳光明网站建设
  • 兰州建设网站汉中建设工程招投标信息网
  • 初中生如何做网站wordpress插件删除失败