@[TOC]
# 【Java设计模式】领域模型模式:构建强大的业务逻辑
## 一、概述
领域模型模式旨在在软件中创建一个与它所设计代表的现实世界系统相匹配的概念模型。它涉及使用丰富的领域对象,这些对象封装了与应用程序领域相关的数据和行为,确保业务逻辑集中化。
## 二、详细解释及实际示例
1. **实际示例**:
- 考虑一个使用领域模型设计模式的在线书店系统。在这个系统中,各种领域对象如`Book`、`Author`、`Customer`和`Order`封装了核心业务逻辑和规则。例如,`Book`对象包含标题、作者、价格和库存数量等属性,以及管理这些属性的方法。`Order`对象管理订单细节、计算总价并验证库存可用性。这种方法确保业务逻辑集中在领域对象中,使系统更具模块化、更易于维护和扩展,因为可以添加新功能。
2. **通俗解释**:
- 领域模型是一个包含行为和数据的领域对象模型。
## 三、Java中领域模型模式的编程示例
假设我们需要构建一个电子商务Web应用程序。在分析需求时,您会注意到有几个名词会反复提及。这就是您的`Customer`和客户寻找的`Product`。这两个是您的特定领域类,每个类都将包含一些特定于其领域的业务逻辑。
在电子商务应用程序的示例中,我们需要处理想要购买产品并在需要时退货的客户的领域逻辑。我们可以使用领域模型模式并创建类`Customer`和`Product`,其中该类的每个实例都包含行为和数据,并仅表示基础表中的一条记录。
```java
public class Customer {
// 客户属性和方法
public class Product {
// 产品属性和方法
```
数据访问对象(DAOs):这些对象提供了对数据库的抽象接口。它们用于检索领域实体并将更改保存回数据库。在提供的代码中,`CustomerDaoImpl`和`ProductDaoImpl`是DAOs。
```java
public class CustomerDaoImpl implements CustomerDao {
// 实现CustomerDao接口中定义的方法
public class ProductDaoImpl implements ProductDao {
// 实现ProductDao接口中定义的方法
```
领域逻辑:这被封装在领域实体中。例如,`Customer`类具有`buyProduct`和`returnProduct`等方法,这些方法代表客户可以执行的操作。
```java
public class Customer {
// 其他属性和方法...
public void buyProduct(Product product) {
// 购买产品的实现
}
public void returnProduct(Product product) {
// 退货产品的实现
}
```
应用程序:`App`类使用领域实体及其方法来实现应用程序的业务逻辑。
```java
public class App {
public static final String H2_DB_URL = "jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1";
public static final String CREATE_SCHEMA_SQL =
"CREATE TABLE CUSTOMERS (name varchar primary key, money decimal);"
+ "CREATE TABLE PRODUCTS (name varchar primary key, price decimal, expiration_date date);"
+ "CREATE TABLE PURCHASES ("
+ "product_name varchar references PRODUCTS(name),"
+ "customer_name varchar references CUSTOMERS(name));";
public static final String DELETE_SCHEMA_SQL =
"DROP TABLE PURCHASES IF EXISTS;"
+ "DROP TABLE CUSTOMERS IF EXISTS;"
+ "DROP TABLE PRODUCTS IF EXISTS;";
public static void main(String[] args) throws Exception {
// 创建数据源并创建客户、产品和购买表
final var dataSource = createDataSource();
deleteSchema(dataSource);
createSchema(dataSource);
// 创建客户
var customerDao = new CustomerDaoImpl(dataSource);
var tom =
Customer.builder()
.name("Tom")
.money(Money.of(USD, 30))
.customerDao(customerDao)
.build();
tom.save();
// 创建产品
var productDao = new ProductDaoImpl(dataSource);
var eggs =
Product.builder()
.name("Eggs")
.price(Money.of(USD, 10.0))
.expirationDate(LocalDate.now().plusDays(7))
.productDao(productDao)
.build();
var butter =
Product.builder()
.name("Butter")
.price(Money.of(USD, 20.00))
.expirationDate(LocalDate.now().plusDays(9))
.productDao(productDao)
.build();
var cheese =
Product.builder()
.name("Cheese")
.price(Money.of(USD, 25.0))
.expirationDate(LocalDate.now().plusDays(2))
.productDao(productDao)
.build();
eggs.save();
butter.save();
cheese.save();
// 显示客户每次购买后的资金余额
tom.showBalance();
tom.showPurchases();
// 购买鸡蛋
tom.buyProduct(eggs);
tom.showBalance();
// 购买黄油
tom.buyProduct(butter);
tom.showBalance();
// 尝试购买奶酪,但收到拒绝,因为他没有足够的钱
tom.buyProduct(cheese);
tom.showBalance();
// 退货黄油并拿回钱
tom.returnProduct(butter);
tom.showBalance();
// Tom现在可以购买奶酪,因为他有足够的钱,并且奶酪因为还有2天过期而有折扣
tom.buyProduct(cheese);
tom.save();
// 显示购物后的资金余额和购买记录
tom.showBalance();
tom.showPurchases();
}
private static DataSource createDataSource() {
var dataSource = new JdbcDataSource();
dataSource.setUrl(H2_DB_URL);
return dataSource;
}
private static void deleteSchema(DataSource dataSource) throws SQLException {
try (var connection = dataSource.getConnection();
var statement = connection.createStatement()) {
statement.execute(DELETE_SCHEMA_SQL);
}
}
private static void createSchema(DataSource dataSource) throws SQLException {
try (var connection = dataSource.getConnection();
var statement = connection.createStatement()) {
statement.execute(CREATE_SCHEMA_SQL);
}
}
```
程序输出:
```java
12:17:23.834 [main] INFO com.iluwatar.domainmodel.Customer -- Tom balance: USD 30.00
12:17:23.836 [main] INFO com.iluwatar.domainmodel.Customer -- Tom didn't bought anything
12:17:23.841 [main] INFO com.iluwatar.domainmodel.Customer -- Tom want to buy Eggs($10,00)...
12:17:23.842 [main] INFO com.iluwatar.domainmodel.Customer -- Tom bought Eggs!
12:17:23.842 [main] INFO com.iluwatar.domainmodel.Customer -- Tom balance: USD 20.00
12:17:23.842 [main] INFO com.iluwatar.domainmodel.Customer -- Tom want to buy Butter($20,00)...
12:17:23.843 [main] INFO com.iluwatar.domainmodel.Customer -- Tom bought Butter!
12:17:23.843 [main] INFO com.iluwatar.domainmodel.Customer -- Tom balance: USD 0.00
12:17:23.843 [main] INFO com.iluwatar.domainmodel.Customer -- Tom want to buy Cheese($20,00)...
12:17:23.843 [main] ERROR com.iluwatar.domainmodel.Customer -- Not enough money!
12:17:23.843 [main] INFO com.iluwatar.domainmodel.Customer -- Tom balance: USD 0.00
12:17:23.843 [main] INFO com.iluwatar.domainmodel.Customer -- Tom want to return Butter($20,00)...
12:17:23.844 [main] INFO com.iluwatar.domainmodel.Customer -- Tom returned Butter!
12:17:23.844 [main] INFO com.iluwatar.domainmodel.Customer -- Tom balance: USD 20.00
12:17:23.844 [main] INFO com.iluwatar.do
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
## 一、概述 领域模型模式旨在在软件中创建一个与它所设计代表的现实世界系统相匹配的概念模型。它涉及使用丰富的领域对象,这些对象封装了与应用程序领域相关的数据和行为,确保业务逻辑集中化。 ## 二、详细解释及实际示例 1. **实际示例**: - 考虑一个使用领域模型设计模式的在线书店系统。在这个系统中,各种领域对象如`Book`、`Author`、`Customer`和`Order`封装了核心业务逻辑和规则。例如,`Book`对象包含标题、作者、价格和库存数量等属性,以及管理这些属性的方法。`Order`对象管理订单细节、计算总价并验证库存可用性。这种方法确保业务逻辑集中在领域对象中,使系统更具模块化、更易于维护和扩展,因为可以添加新功能。 2. **通俗解释**: - 领域模型是一个包含行为和数据的领域对象模型。
资源推荐
资源详情
资源评论
收起资源包目录
domain-model.zip (17个子文件)
domain-model
pom.xml 3KB
src
test
java
com
iluwatar
domainmodel
ProductDaoImplTest.java 5KB
TestUtils.java 2KB
CustomerDaoImplTest.java 6KB
ProductTest.java 3KB
AppTest.java 2KB
CustomerTest.java 4KB
main
java
com
iluwatar
domainmodel
CustomerDao.java 2KB
ProductDao.java 2KB
Product.java 3KB
App.java 6KB
CustomerDaoImpl.java 4KB
Customer.java 5KB
ProductDaoImpl.java 4KB
etc
domain-model.urm.png 314KB
domain-model.urm.puml 3KB
README.md 10KB
共 17 条
- 1
资源评论
道长不会写代码
- 粉丝: 2534
- 资源: 117
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功