//两个模型数据访问层的定义部分都是一样的
//假定getFriends()方法要访问数据库,可以用JDBC,Hibernate等不同的方法实现
//在这里为了说明方便,硬编码,实现方法如下
-
-
-
- public interface PersonBo {
- public List getFriends();
- }
/**
* 声明业务接口(忽略数据访问DAO)
*/
public interface PersonBo {
public List getFriends();
}
-
-
-
- public class PersonBoImpl implements PersonBo{
-
-
-
- public List getFriends(){
- List friends = new ArrayList();
- friends.add(new Person("york",27));
- friends.add(new Person("wyork",28));
- friends.add(new Person("勇",27));
- return friends;
- }
- }
/**
* 硬编码实现
*/
public class PersonBoImpl implements PersonBo{
/**
* or db operation
* */
public List getFriends(){
List friends = new ArrayList();
friends.add(new Person("york",27));
friends.add(new Person("wyork",28));
friends.add(new Person("勇",27));
return friends;
}
}
-
-
-
- public class PersonBoFactory{
- public static PersonBo getPersonBo(){
- return new PersonBoImpl();
- }
- }
/**
* 输出业务逻辑实现
*/
public class PersonBoFactory{
public static PersonBo getPersonBo(){
return new PersonBoImpl();
}
}
// 第一种模型:失血模型?
-
-
-
- public class Person {
- private String name = "";
-
- private int age = 0;
-
- public Person(String name, int age) {
- setName(name);
- setAge(age);
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public String getName() {
- return this.name;
- }
-
- public void setAge(int age) {
- this.age = age;
- }
-
- public int getAge() {
- return this.age;
- }
-
- public String toString() {
- return "name= "+getName()+";age="+getAge();
- }
-
- }
/*
* 只有属性和对属性的操作
*/
public class Person {
private String name = "";
private int age = 0;
public Person(String name, int age) {
setName(name);
setAge(age);
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return this.age;
}
public String toString() {
return "name= "+getName()+";age="+getAge();
}
}
-
-
-
- public class testPerson{
- public static void main(String[] args){
- System.out.println(">>>>>begin");
-
-
- List friends = PersonBoFactory.getPersonBo().getFriends();
- if(friends!=null)
- for(int i=0;i<friends.size();i++){
- Person friend = (Person)friends.get(i);
- System.out.println(i+".friend "+friend.toString());
- }
- System.out.println("<<<<<end");
- }
- }
/*
* 注意获取friends的方法
*/
public class testPerson{
public static void main(String[] args){
System.out.println(">>>>>begin");
// 如果外部BO,可以在Factory里面声明protected类型
// 如PersonBoFactory.getBookBo().getBooks();
List friends = PersonBoFactory.getPersonBo().getFriends();
if(friends!=null)
for(int i=0;i<friends.size();i++){
Person friend = (Person)friends.get(i);
System.out.println(i+".friend "+friend.toString());
}
System.out.println("<<<<<end");
}
}
//第二种模型:贫血模型?
//这个抽象类似乎是失血模型,但是多了一个方法声明
-
-
-
- public abstract class AbstractPerson {
- private String name = "";
-
- private int age = 0;
-
- public AbstractPerson() {
- }
-
- public AbstractPerson(String name, int age) {
- setName(name);
- setAge(age);
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public String getName() {
- return this.name;
- }
-
- public void setAge(int age) {
- this.age = age;
- }
-
- public int getAge() {
- return this.age;
- }
-
- public String toString() {
- return "name= "+getName()+";age="+getAge();
- }
-
-
- public abstract List getFriends();
- }
/*
* 抽象类,除了拥有失血模型的特征,还声明了需要BO里面实现的方法
*/
public abstract class AbstractPerson {
private String name = "";
private int age = 0;
public AbstractPerson() {
}
public AbstractPerson(String name, int age) {
setName(name);
setAge(age);
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return this.age;
}
public String toString() {
return "name= "+getName()+";age="+getAge();
}
//注意啦!!!
public abstract List getFriends();
}
//似乎是贫血模型的一部分,但是又继承了失血模型
-
-
-
-
-
- public class Person extends AbstractPerson {
- public Person(){
- super("",0);
- }
- public Person(String name, int age) {
- super(name, age);
- }
-
- public List getFriends() {
- return PersonBoFactory.getPersonBo().getFriends();
- }
- }
/*
* 继承抽象类中的失血模型,
* 实现抽象类中的BO部分,自己不实现.
* 除了拥有失血模型的特征,还声明了需要BO里面实现的方法
*/
public class Person extends AbstractPerson {
public Person(){
super("",0);
}
public Person(String name, int age) {
super(name, age);
}
public List getFriends() {
return PersonBoFactory.getPersonBo().getFriends();
}
}
-
-
-
- public class testPerson{
- public static void main(String[] args){
- System.out.println(">>>>>begin");
-
- List friends = (List)(new Person()).getFriends();
- if(friends!=null)
- for(int i=0;i<friends.size();i++){
- Person friend = (Person)friends.get(i);
- System.out.println(i+".friend "+friend.toString());
- }
- System.out.println("<<<<<end");
- }
- }
/*
* 注意获取friends的方法
*/
public class testPerson{
public static void main(String[] args){
System.out.println(">>>>>begin");
// 不用调用BO,业务测是透明的,只知道Person中有这个方法
List friends = (List)(new Person()).getFriends();
if(friends!=null)
for(int i=0;i<friends.size();i++){
Person friend = (Person)friends.get(i);
System.out.println(i+".friend "+friend.toString());
}
System.out.println("<<<<<end");
}
}
/**
为了能说明情况,两种数据访问层都是一样的,由于模型Person定义的不同,testPerson调用getFriends()的操作也是不一样的.
我个人感觉,第一种Person在Action或其他操作中要调用PersonBoFactory,需要输出PersonBo
第二种用起来更OO,只需要调用Person就可以了,其他BO的东西对客户程序员都是透明的.
*/
//很久以前就看过Robbin关于领域模型的讨论了,不知道第二种模型是不是贫血模型?
/*
不知道你们怎么看呢?
业务的数据访问层用PersonBoFactory隔离不知道有什么风险没有.
*/ |