优化的领域模型

//两个模型数据访问层的定义部分都是一样的
//假定getFriends()方法要访问数据库,可以用JDBC,Hibernate等不同的方法实现
//在这里为了说明方便,硬编码,实现方法如下
[code]
/**
* 声明业务接口(忽略数据访问DAO)
*/
public interface PersonBo {
public List getFriends();
}
[/code]

[code]
/**
* 硬编码实现
*/
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;
}
}[/code]

[code]
/**
* 输出业务逻辑实现
*/
public class PersonBoFactory{
public static PersonBo getPersonBo(){
return new PersonBoImpl();
}
}[/code]

// 第一种模型:失血模型?
[code]
/*
* 只有属性和对属性的操作
*/
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();
}

}[/code]

[code]
/*
* 注意获取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");
}
}[/code]


//第二种模型:贫血模型?
//这个抽象类似乎是失血模型,但是多了一个方法声明
[code]
/*
* 抽象类,除了拥有失血模型的特征,还声明了需要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();
}
[/code]
//似乎是贫血模型的一部分,但是又继承了失血模型
[code]
/*
* 继承抽象类中的失血模型,
* 实现抽象类中的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();
}
}
[/code]

[code]
/*
* 注意获取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");
}
}
[/code]


/**
为了能说明情况,两种数据访问层都是一样的,由于模型Person定义的不同,testPerson调用getFriends()的操作也是不一样的.

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

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

/*
不知道你们怎么看呢?
业务的数据访问层用PersonBoFactory隔离不知道有什么风险没有.
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值