详细内容
一、架构分层:
MVC,即 Model 模型、View 视图,及 Controller 控制器。
- View:视图,为用户提供使用界面,与用户直接进行交互。
- Model:模型,承载数据,并对用户提交请求进行计算的模块。其分为两类:
一类称为数据承载 Bean:实体类,专门用户承载业务数据的,如 Student、User 等
一类称为业务处理 Bean:指 Service 或 Dao 对象,专门用于处理用户提交请求的。 - Controller:控制器,用于将用户请求转发给相应的 Model 进行处理,并根据 Model 的计算结果向用户提供相应响应。
DDD(领域驱动)的实现,就是在此之外增加领域层。
领域层包括:
- 领域对象:包括对象的属性。与Getter、Setter方法。不提供属性的实现。领域对象不交由Spring控制。由manager使用new方法创建。领域对象也可以使用【代理模式】,只让领域manager能对外提供领域对象,保证领域对象的封装性。
- 领域对象实现类manager:提供领域对象属性的实现、领域对象对外提供的服务的实现。manager类可交由Spring控制(标签@Named),Spring控制的bean默认是单例模式,所以manager不能有非共享属性,所以manager是贫血模型的。
- 若领域对象对外提供的方法比较多,且符合多态条件。则可以先建立AbstractManager抽象manager,确定服务。再分别实现抽象manager的多态方法。再建立领域对象Factory工厂类,根据条件调用不同的实现类。[策略工厂模式]
二、例:
- 领域对象VO
public class DDDSchool {
private Students students;
private Map<String,Teacher> teacherMap;
Getter...
Setter...
}
- 领域对象抽象Manager的实现类1
@Named
public class DDDSchoolManager1 extends AbstractDDDSchoolManager {
@Inject
private StudentsDao studentsDao;
@Inject
private TeacherDao teacherDao;
/**
*为领域对象设置学生属性值
*/
@Override
public DDDSchool setStudents(){
Students s = studentsDao.getStudents();
DDDSchool ddd = new DDDSchool();
ddd.setStudents(s);
return ddd;
}
/**
*获取领域对象学生中年龄最大的学号
*/
@Override
public Long getStudentsMaxNO(){
xxxx
}
xxxx
}
- 领域对象工厂
@Named
public class DDDSchoolFactory {
@Inject
private DDDSchoolManager1 dddSchoolManager1;
@Inject
private DDDSchoolManager2 dddSchoolManager3;
/*类中方法被调用时才初始化
*不在构造函数中初始化,是因为那个时候manager还没有被Spring创建
*/
private HashMap<String,DDDSchoolManager> managers = new HashMap();
public DDDSchoolManager getDDDSchoolManager(String schoolName){
if(managers.isEmpty()){
managers.put("一中",dddSchoolManager1);
managers.put("二中",dddSchoolManager2);
}
return managers.get(schoolName);
}
}
- 然后在MVC的模型层Service中就可以调用了
@Inject
private DDDSchoolFactory dddSchoolFactory;
public Void xxxx(){
DDDSchoolManager dddSchoolManager1 = dddSchoolFactory.getDDDSchoolManager("一中");
//这里就调用了不同实现类的领域manager方法了。
String maxNo = dddSchoolManager1.getStudentsMaxNO();
}