領域模型分類

一、失血模型
只有getter和setter方法的實體類,所有的業務邏輯完全由Service層來完成。

代碼示例:
Domain:

public class Person {
private long id;
private String name;
private int age;

//getter and setter …
}

DAO接口:

public interface PersonDAO {
public Person findPersonById(long id);
}

DAO實現:

public class IbatisPersonDAO implements PersonDAO {

private SqlMapClientTemplate sqlMapClientTemplate = new SqlMapClientTemplate();

public Person findPersonById(long id) {
return (Person) sqlMapClientTemplate.queryForObject("MS-PERSON-FIND-PERSON-BY-ID", id);
}
}

Service層:

public class PersonService {

private IbatisPersonDAO ibatisPersonDAO;

public Person findPersonInfo(long id) {
return ibatisPersonDAO.findPersonById(id);
}

public void setIbatisPersonDAO(IbatisPersonDAO ibatisPersonDAO) {
this.ibatisPersonDAO = ibatisPersonDAO;
}
}

二、貧血模型
領域對象包含不依賴於持久化的領域邏輯,而那些依賴持久化的領域邏輯被分離到Service層。

示例代碼:
Domain:

public class Person {

private long id;
private String name;
private int age;

public void modifyPerson(long id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}

//getter and setter ...
}

Service層:

public class PersonService {

private IbatisPersonDAO ibatisPersonDAO;

public void modifyPersonInfo(long id,String name,int age) {
Person person = new Person();
person. modifyPerson(id,name,age);
ibatisPersonDAO.updatePersonById(person);
}

public void setIbatisPersonDAO(IbatisPersonDAO ibatisPersonDAO) {
this.ibatisPersonDAO = ibatisPersonDAO;
}
}

三、充血模型
絕大部分業務邏輯被放在領域對象中(包括持久化邏輯),而Service層僅僅封裝事務和少量邏輯,不調用DAO層。

示例代碼:
Domain:

public class Person {

private long id;
private String name;
private int age;
private IbatisPersonDAO ibatisPersonDAO;

public void modifyPerson(long id,String name,int age) {
this.id = id;
this.name = name;
this.age = age;
ibatisPersonDAO.updatePersonById(this);
}

//getter and setter ...
}

Service層:

public class PersonService {

public void modifyPersonInfo(long id, String name, int age) {
Person person = new Person();
person.modifyPerson(id,name,age);
}

}

四、脹血模型
去掉Service層,只保留領域對象。

示例代碼:
Domain:

public class Person {

private long id;
private String name;
private int age;
private IbatisPersonDAO ibatisPersonDAO;

public void modifyPerson(long id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
ibatisPersonDAO.updatePersonById(this);
}

//getter and setter ...
}

[quote]
失血模型和脹血模型是不被提倡的,推薦使用貧血模型。

失血模型缺點:
無任何業務邏輯的純實體類

脹血模型缺點:
1、很多不是領域對象的業務邏輯也被強行放入領域對象,導致領域對象不穩定
2、暴露給web層過多的領域對象信息

充血模型缺點:
考慮到Service層的事務封裝特性,Service層必須對所有領域對象的邏輯提供相應的事務封裝方法,其結果就是Service層完全重定義一遍所有的領域對象。而且Service層的事務化封裝其意義就等於把OO的領域對象轉換爲過程的Service TransactionScript。該充血模型在Domain層實現的OO在Service層又變成了過程式,從Web層程序員的角度來看,和貧血模型沒有區別

貧血模型優點:
1、各層單向依賴,結構清楚,易於實現和維護
2、設計簡單易行,底層模型非常穩定
[/quote]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章