智能领域对象设计(实例讲解)-2/2

10-08-09 cuwkuhaihong
上一篇:智能领域对象设计(演绎革命)-1

如果你没有读过关于智能领域对象设计的文章,又对此有点兴趣,那么BaseService和ThinObject一定能满足你的需要。

BaseService源代码:

// 在此输入java代码
public class BaseService {

	public BeanTable getBeanTable(Class clz) throws SQLException {
		return ThinContext.ctx.getBeanTable(clz);
	}
	public void add(Object bean) {
		try {
			getBeanTable(bean.getClass()).add(KVUtils.toKeyValue(bean));
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
	protected List getObject(Class clz, Criterion... criterion)
			throws Exception {
		List<Map<String, Object>> kvs = getBeanTable(clz).get(criterion);
		return KVUtils.toBeans(kvs, clz);
	}
	public void updateObject(Object obj) throws  Exception {
		getBeanTable(obj.getClass()).update(KVUtils.toKeyValue(obj));
	}
	public void deleteObject(Object obj) throws  Exception {
		getBeanTable(obj.getClass()).delete(KVUtils.toKeyValue(obj));
	}
}
<p>

ThinObject以及相关代码可以从我的demo中找到,这个demo是完成就医预约功能,填写“就医预约单”,单据保存后,发布预约医生的事件,然后点击“查询预约”查询预约情况。

把工程导入eclipse:

这是用maven构建的项目包含两个模块,idemo-webapp包含显示和业务逻辑等,thin是持久层框架。展开后:

org.idemo.common下的功能,无论增加多少代码这里都不用变;

org.idemo.model是包含两个领域对象;

org.idemo.view是用于显示的页面,本代码使用wicket框架。

我们以后增加其他的业务代码就在model和view下编写即可,使业务逻辑代码比例最大化,将有限的精力专注在业务逻辑和UI代码。当然并不是说service类就绝对不需要了,当一个任务需要多个对象配合才能完成,就需要建立一个service类让多个对象合作完成任务。如模拟战争场面中常见的炸碉堡,就需要守方机枪手,攻方机枪手掩护和爆破手三个对象参与,没有service类是不易完成。

src/main/resources下有两个配置文件,分别对应Doctor和Reservation。

*Doctor_sql.properties是用来为Doctor对象提供个性化的、Thin无法提供的SQL,为了让程序和SQL分离,更换数据库,便于调整SQL。没有个性SQL可以不要此文件。

*Reservation_lstnr.properties这里是用来配置监听器的,在这里配置的类都必须‘implements Observer’这里配置的类可以让对象发生关系,不需要影响其他的类,可以不要此文件。

在一个系统中很多对象都不是孤立存在的,他们之间存在相互影响的因果关系,在通常情况下,一个“因”可能会有多个“果”,这种因果关系在不同的业务环境下,是易变,所以这里必须提供可配置,做到易扩展和业务弱隔离。如此现实中的因果链,就很容易实现。如飞机上有一个人突发心脏病,(1)乘务员在着陆前通过无线电报告给机场;(2)机场收到消息后通知120急救中心;(3.1)120急救中心通知心脏科的主治医生马上赶到医院;(3.2)120急救中心派救护车赶往机场;......。乘务员从第2个因果关系开始就不知道接下来还发生什么事情了,也不用关心了,因为他的职务已经完成,第2个原因产生了两个果(3.1)、(3.2),在不同的应用系统环境中,可能还会有(3.3)、(3.4)等等。

再来看看测试,通常难以测试的开发模式,就难以使用。

分层的一个好处是测试的时候不用启动Servlet容器,智能领域对象设计同样不许要启动容器,除了需要thin,junit(习惯)外,其他都不需要了,从上图可以简单看到!你可以在不写任何页面代码的情况下,完成所有的和必要的业务逻辑开发和测试,使分工更加方便细致。

[啰嗦的附录-附上最新的IObject源代码]

// 在此输入java代码
/**
 * 这是智能领域对象设计的核心类,所谓智能主要体现在独立性上,可不借助外援 完成份内工作。即便子类所描述的对象在现实中不具备此能力。
 * 
 * @author Haihong.Wang
 * @since 2010-8-4
 */
public abstract class IObject extends Observable implements Serializable {
	/**
	 */
	private static final long serialVersionUID = 1L;

	/**
	 * 把对象自身持久到数据库。子类可以根据类的情况,重写该方法。 如该类是复合对象,想关联存储,则需要重写该方法
	 * 
	 */
	public abstract void remember();

	/**
	 * 删除此对象对应的数据库记录。 恰如我们忘记一件事物
	 */
	public abstract void forget();

	/**
	 * 用于更新数据库记录,需要更新对象的某一个属性时,用到此方法。 恰如我们需要更新对事物的记忆。
	 * 我们每隔三天去看一个正在建设的高楼,那么大脑每次都要更新高楼的高度。
	 * 
	 * @param updateFields
	 *            属性的名称,如果你更改username的值,那么这个参数就应该是username, 注意不是username的值
	 */
	public abstract void updateMemory(String... updateFields);

	/**
	 * 这是一个最自由的,最难以理解的,最惹争议的方法。所以在这里解释以下,该类方法名称可意为
	 * “联想”或者“匹配”,英语associate包含这两种解释,有一定哲学含义, 即:要素与一系列对象属性的匹配过程就叫联想。
	 * 默认实现是查询相关对象。如:我们通过宝马联想到奔驰和奥迪。
	 * 
	 * 如果这是一个事件对象,那么你可以让他想到与这个事件相关的任何东西。 在子类中可以自己添加相关的‘associateXXX()’方法。
	 * 
	 * @param params
	 *            任何对象要素
	 * @return
	 */
	public abstract List associate(Object... params);

	/**
	 * 根据主键数据库中获取自身全部信息
	 * 
	 * @param id
	 * @return
	 */
	public abstract void obtainMe();

}
<p>

[该贴被cuwkuhaihong于2010-08-09 13:24修改过]

2
myan
2010-08-17 12:52
大叔 你真水没事天天去引用qq空间的图片

cuwkuhaihong
2010-08-24 13:03
2010年08月17日 12:52 "myan"的内容
大叔 你真水没事天天去引用qq空间的图片 ...

哈哈,那空间是我自己的,jdon无法上传这么多,这么大的图片,我才放到自己的空间的,引用到这里的。

猜你喜欢