Model:模型。
状态:即数据。
逻辑:即服务、行为、函数、功能。
模型就是当我们使用软件去解决真实世界中各种实际问题的时候,对那些我们关心的实际事物的抽象和简化。比如在软件系统中设计"人"这个事物类型,会去考虑姓名、性别、年龄等一些系统必要属性。
Model可以进行创建、修改、删除,即状态的变化。
MVC中的模型:
模型层Model,它包含了模型上承载的实实在在的业务数据,还有不同数据间的关联关系。
模型实体:不包含逻辑,但包含状态,而逻辑被解耦到了无状态Service中。(状态:即数据)
贫血模型和充血模型
贫血模型:逻辑从模型实体中剥离出去,并放到了无状态的Service层,于是状态和逻辑就被解耦开。
充血模型:既包含数据,也包含逻辑,具备了更高程度的完备性和自恰性。
贫血模型
类class,有2个方法getters、setters等属性获取和设置方法,扮演的角色就是一个用作封装的容器。
类BookService,lendOut方法将书从图书馆借出,接收2个参数:图书id和用户id。
public class Book {
private int id;
private boolean onLoan;
public int getId() {
return this.id;
}
public void setId(int id) {
this.id = id;
}
public boolean isOnLoan() {
return this.loan;
}
public void setOnLoan(boolean onLoan) {
this.onLoan = onLoan;
}
}
public class BookService {
public Book lendOut(int bookId, int userId, Date date) {
... 逻辑代码,参数校验、数据源获得的原始数据装配到返回对象中,需要进行过滤条件
... 逻辑代码,数据库查询
}
}
充血模型
模型实体:包含数据,也包含逻辑,具备更高程度的完备性和自洽性。
真正面向对象,通过操作有状态的模型实体类,就可以达到数据变更的目的。
类Book,lendOut方法不再需要传入bookid,
public class Book {
private int id;
private boolean onLoan;
public void lendOut(User user, Date date) { ... }
... // 省略属性的获取和设置方法
}
Model内部层次划分
基于贫血模型的划分:每一层都可以调用自身所属层的其他类,也可以调用自己下方一层的类,但是不允许往上调用。Model Driven是和业务模型实体相关,Business Independent是基础设施服务,和业务无关。
- Facade:提供粗粒度的接口。比如创建用户,同时免费赠送一本书,就需要2个服务的行为去做统一事务控制。
- Service:属于单个领域模型实体的操作。
- 数据访问层:数据访问中需要。比如关系型数据库,存放数据库字段和模型对象之间的ORM(Object-Relation Mapping,对象关系映射)关系。
-
基础设施层
image.png
网友评论