zoukankan      html  css  js  c++  java
  • 一文解读贫血/充血模型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符合单一职责,不像在贫血模型里面那样包含所有的业务逻辑太过沉重。缺点是比较复杂,对技术要求更高。

  • 相关阅读:
    甘超波:NLP五步脱困法
    甘超波:NLP换框法
    甘超波:NLP先跟后带
    甘超波:NLP瞬间亲和力
    甘超波:NLP回应与建议技巧
    甘超波:NLP复述
    甘超波:NLP新旧ABC觉察法
    甘超波:NLP潜意识和意识
    甘超波:NLP人际界线
    甘超波:NLP表象系统
  • 原文地址:https://www.cnblogs.com/IT-Evan/p/Model2.html
Copyright © 2011-2022 走看看