一文解读贫血/充血模型2 (转)

一、贫血模型

所谓贫血模型,是指Model 中,仅包含状态(属性),不包含行为(方法),采用这种设计时,需要分离出DB层,专门用于数据库操作。

二、充血模型

Model 中既包括状态,又包括行为,是最符合面向对象的设计方式。

以下为举例说明:

对于员工Employee来说,每个员工的属性有Id,Name,Sex,BirthDay,Parent(上级),行为有查找,保存,删除,职位调整(更换上级) 等

采用贫血模型实现

Model:

 1 public class Employee
 2     {
 3         public string Id { get; set; }
 4         public string Name { get; set; }
 5         public string Sex { get; set; }
 6         public DateTime? BirthDay { get; set; }
 7         /// <summary>
 8         /// 直属上级的Id
 9         /// </summary>
10         public string ParentId { get; set; }
11     }
View Code

DB 层

1 //实现方法略    
2 public class EmpDAO
3 {
4     public static bool AddEmployee(Employee emp);
5     public static bool UpdateEmployee(Employee emp);
6     public static bool DeleteEmployee(Employee emp);
7     public static Employee GetEmployeeById(string Id);
8 }
View Code

BLL 层

 1 public class EmpBLL
 2     {
 3         public void Test()
 4         {
 5             Employee emp1 = new Employee() { Id = System.Guid.NewGuid().ToString(), Name = "张三", Sex = "" };
 6             Employee emp2 = new Employee() { Id = System.Guid.NewGuid().ToString(), Name = "李四", Sex = "", ParentId = emp1.Id };
 7            //插入员工
 8             EmpDAO.AddEmployee(emp1);
 9             EmpDAO.AddEmployee(emp2);
10 
11             //取员工的上级
12             var emp2Parent = EmpDAO.GetEmployeeById(emp2.ParentId);
13             var emp2Parent_Parent = EmpDAO.GetEmployeeById(emp2Parent.ParentId);
14 
15             //删除员工
16             EmpDAO.DeleteEmployee(emp1);
17             EmpDAO.DeleteEmployee(emp2);
18         }
19     }
View Code

若采用充血模型设计,则应只分两层 ,Model 层(包含状态和行为)和Service(BLL) 层

Model 层

 1 public class Employee
 2     {
 3         public string Id { get; set; }
 4         public string Name { get; set; }
 5         public string Sex { get; set; }
 6         public DateTime? BirthDay { get; set; }
 7         /// <summary>
 8         /// 直属上级的Id
 9         /// </summary>
10         public string ParentId { get; set; }
11         private Employee _parent;
12 
13         public static Employee query(string id)
14         {
15             Employee emp = new Employee();
16             //实现略,仅需填充emp的熟悉即可
17             return emp;
18         }
19         /// <summary>
20         /// 保存对象,实现略
21         /// </summary>
22         /// <returns></returns>
23         public bool Save()
24         {
25             return true;
26         }
27         /// <summary>
28         /// 删除对象,实现略
29         /// </summary>
30         /// <returns></returns>
31         public bool Drop()
32         {
33             return true;
34         }
35         /// <summary>
36         /// 上级领导,此处直接获得了Employee对象
37         /// </summary>
38         public Employee Parent
39         {
40             get
41             {
42                 if (_parent != null)
43                 {
44                     return _parent;
45                 }
46                 else
47                 {
48                     _parent = query(this.ParentId);
49                     return _parent;
50                 }
51             }
52             set
53             {
54                 _parent = value;
55                 this.ParentId = _parent.Id;
56                 Save();
57             }
58         }
59     }
View Code

Service 层

 1 public class EmpService
 2     {
 3         public void Test()
 4         {
 5             Employee emp1 = new Employee() { Id = System.Guid.NewGuid().ToString(), Name = "张三", Sex = "" };
 6             Employee emp2 = new Employee() { Id = System.Guid.NewGuid().ToString(), Name = "李四", Sex = "", ParentId = emp1.Id };
 7             //插入员工
 8             emp1.Save();
 9             emp2.Save();
10 
11             //取员工的上级
12             var emp2Parent = emp2.Parent;
13             var emp2Parent_Parent = emp2Parent.Parent;
14 
15             //删除员工
16             emp2.Drop();
17             emp1.Drop();
18         }
19     }
View Code

总结:

  从两者Service层和BLL 层的代码区分来看,两者都是实现了业务功能和延迟加载。

贫血模型优点是系统的层次结构清楚,各层之间单向依赖。缺点是不够面向对象。

充血模型优点是面向对象,Business Logic符合单一职责,不像在贫血模型里面那样包含所有的业务逻辑太过沉重。缺点是比较复杂,对技术要求更高。

猜你喜欢

转载自www.cnblogs.com/IT-Evan/p/Model2.html