SpringMVC框架下实现DDD编程

一、架构分层:

MVC,即 Model 模型、View 视图,及 Controller 控制器。

  1. View:视图,为用户提供使用界面,与用户直接进行交互。
  2. Model:模型,承载数据,并对用户提交请求进行计算的模块。其分为两类:
    一类称为数据承载 Bean:实体类,专门用户承载业务数据的,如 Student、User 等
    一类称为业务处理 Bean:指 Service 或 Dao 对象,专门用于处理用户提交请求的。
  3. Controller:控制器,用于将用户请求转发给相应的 Model 进行处理,并根据 Model 的计算结果向用户提供相应响应。

DDD(领域驱动)的实现,就是在此之外增加领域层。
领域层包括:

  1. 领域对象:包括对象的属性。与Getter、Setter方法。不提供属性的实现。领域对象不交由Spring控制。由manager使用new方法创建。领域对象也可以使用【代理模式】,只让领域manager能对外提供领域对象,保证领域对象的封装性。
  2. 领域对象实现类manager:提供领域对象属性的实现、领域对象对外提供的服务的实现。manager类可交由Spring控制(标签@Named),Spring控制的bean默认是单例模式,所以manager不能有非共享属性,所以manager是贫血模型的。
  3. 若领域对象对外提供的方法比较多,且符合多态条件。则可以先建立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();
	}

你可能感兴趣的:(日常问题-javaWeb,spring,DDD编程)