只有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]