UML软件工程组织

 

 

优化的领域模型
 
2008-05-20 作者:wyork 来源:javaeye.com
 
//两个模型数据访问层的定义部分都是一样的
//假定getFriends()方法要访问数据库,可以用JDBC,Hibernate等不同的方法实现
//在这里为了说明方便,硬编码,实现方法如下
 
Java代码 复制代码
  1. /**  
  2.  * 声明业务接口(忽略数据访问DAO)  
  3.  */  
  4. public interface PersonBo {   
  5.       public List getFriends();   
  6. }  
Java代码 复制代码
  1. /**  
  2.  * 硬编码实现  
  3.  */  
  4. public class PersonBoImpl implements PersonBo{   
  5.     /**  
  6.      * or db operation  
  7.      * */  
  8.     public List getFriends(){   
  9.         List friends = new ArrayList();   
  10.         friends.add(new Person("york",27));   
  11.         friends.add(new Person("wyork",28));   
  12.         friends.add(new Person("勇",27));   
  13.         return friends;   
  14.     }      
  15. }  
Java代码 复制代码
  1. /**  
  2.  * 输出业务逻辑实现  
  3.  */  
  4. public class PersonBoFactory{   
  5.       public static PersonBo getPersonBo(){   
  6.           return new PersonBoImpl();   
  7.       }   
  8. }  
// 第一种模型:失血模型?
 
Java代码 复制代码
  1. /*  
  2.  * 只有属性和对属性的操作  
  3.  */  
  4. public class Person {   
  5.     private String name = "";   
  6.   
  7.     private int age = 0;   
  8.   
  9.     public Person(String name, int age) {   
  10.         setName(name);   
  11.         setAge(age);   
  12.     }   
  13.   
  14.     public void setName(String name) {   
  15.         this.name = name;   
  16.     }   
  17.   
  18.     public String getName() {   
  19.         return this.name;   
  20.     }   
  21.   
  22.     public void setAge(int age) {   
  23.         this.age = age;   
  24.     }   
  25.   
  26.     public int getAge() {   
  27.         return this.age;   
  28.     }   
  29.   
  30.     public String toString() {   
  31.         return "name= "+getName()+";age="+getAge();   
  32.     }   
  33.   
  34. }  
Java代码 复制代码
  1. /*  
  2.  * 注意获取friends的方法  
  3.  */  
  4. public class testPerson{   
  5.       public static void main(String[] args){   
  6.           System.out.println(">>>>>begin");   
  7.           // 如果外部BO,可以在Factory里面声明protected类型   
  8.             // 如PersonBoFactory.getBookBo().getBooks();   
  9.           List friends = PersonBoFactory.getPersonBo().getFriends();   
  10.           if(friends!=null)   
  11.           for(int i=0;i<friends.size();i++){   
  12.               Person friend = (Person)friends.get(i);   
  13.               System.out.println(i+".friend "+friend.toString());      
  14.           }   
  15.           System.out.println("<<<<<end");   
  16.       }   
  17. }  
//第二种模型:贫血模型?
//这个抽象类似乎是失血模型,但是多了一个方法声明
 
Java代码 复制代码
  1. /*  
  2.  * 抽象类,除了拥有失血模型的特征,还声明了需要BO里面实现的方法  
  3.  */  
  4. public abstract class AbstractPerson {   
  5.     private String name = "";   
  6.   
  7.     private int age = 0;   
  8.   
  9.     public AbstractPerson() {   
  10.     }   
  11.   
  12.     public AbstractPerson(String name, int age) {   
  13.         setName(name);   
  14.         setAge(age);   
  15.     }   
  16.   
  17.     public void setName(String name) {   
  18.         this.name = name;   
  19.     }   
  20.   
  21.     public String getName() {   
  22.         return this.name;   
  23.     }   
  24.   
  25.     public void setAge(int age) {   
  26.         this.age = age;   
  27.     }   
  28.   
  29.     public int getAge() {   
  30.         return this.age;   
  31.     }   
  32.   
  33.     public String toString() {   
  34.         return "name= "+getName()+";age="+getAge();   
  35.     }   
  36.   
  37.     //注意啦!!!   
  38.     public abstract List getFriends();   
  39. }  
//似乎是贫血模型的一部分,但是又继承了失血模型
 
Java代码 复制代码
  1. /*  
  2.  * 继承抽象类中的失血模型,  
  3.  * 实现抽象类中的BO部分,自己不实现.  
  4.  * 除了拥有失血模型的特征,还声明了需要BO里面实现的方法  
  5.  */  
  6. public class Person extends AbstractPerson {   
  7.     public Person(){   
  8.         super("",0);    
  9.      }   
  10.      public Person(String name, int age) {   
  11.          super(name, age);   
  12.      }   
  13.   
  14.     public List getFriends() {   
  15.         return PersonBoFactory.getPersonBo().getFriends();   
  16.     }   
  17. }  
Java代码 复制代码
  1. /*  
  2.  * 注意获取friends的方法  
  3.  */  
  4. public class testPerson{   
  5.     public static void main(String[] args){   
  6.         System.out.println(">>>>>begin");   
  7.         // 不用调用BO,业务测是透明的,只知道Person中有这个方法   
  8.         List friends = (List)(new Person()).getFriends();   
  9.         if(friends!=null)   
  10.         for(int i=0;i<friends.size();i++){   
  11.             Person friend = (Person)friends.get(i);   
  12.             System.out.println(i+".friend "+friend.toString());      
  13.         }   
  14.         System.out.println("<<<<<end");   
  15.     }   
  16. }  
/**
为了能说明情况,两种数据访问层都是一样的,由于模型Person定义的不同,testPerson调用getFriends()的操作也是不一样的.

我个人感觉,第一种Person在Action或其他操作中要调用PersonBoFactory,需要输出PersonBo
第二种用起来更OO,只需要调用Person就可以了,其他BO的东西对客户程序员都是透明的.
*/

//很久以前就看过Robbin关于领域模型的讨论了,不知道第二种模型是不是贫血模型?

/*
不知道你们怎么看呢?
业务的数据访问层用PersonBoFactory隔离不知道有什么风险没有.
*/
 

组织简介 | 联系我们 |   Copyright 2002 ®  UML软件工程组织 京ICP备10020922号

京公海网安备110108001071号