标签:
领域模型根据业务逻辑编写,以及生成对象(对象安全,与数据层分离)
处理业务逻辑,根据业务逻辑编写,如果每个类与数据表相对应是最好不过,但是现实生产并不是这样. 主要功能是这样,如公交站会有很多公交车(公交车也是一个对象,它可能拥有乘客)以及车站的基本信息(名称等等),我们把车站声明为一个领域对象,构造方法可以传入ID已经车站的基本信息,每一条基本信息拥有自己的set get 方法,这里还会拥有公交车的get set (公交车的领域对象)
数据层
数据映射器可以很好的完成数据库操作,好处在于领域模型可以更专注的处理业务逻辑,而不必过多的关心数据库的操作。
在数据映射器类中,编写可以用到的sql语句,已经增删改查方法的编写。添加方法:通过领域模型的set方法注入需要添加的字段(如为车站起一个名字),这是一个完整的车站,现在是时候把它写到数据库中了,我们实例化车站的数据映射器,向添加方法中传入刚刚实例的车站对象,在映射器中执行车站对象的get方法取得车站信息,然后执行sql来添加数据库,添加返回主键ID,可以把ID存在领域对象中,以便之后对该对象的更新删除查找操作,更新操作同添加。查找,我们或许会从$_REQUEST中拿到想要查找的ID,首先,实例化映射器,传入ID,然后执行映射器查找方法,将查找到的信息写入我们的领域对象中。我们应该在查找出数据的时候实例化我们需要的领域对象,如此,可以在映射器中添加实例化领域对象方法。
如上延伸,查找一跳数据,映射器可以很好的完成实例化领域模型,但是,更多的时候需要一次查找出十几条,甚至几百条数据,我们需要对每一条数据进行实例化领域操作,会造成性能的低下,改进实例化操作,iterator(迭代器)接口。
Iterator extends Traversable {
/* 方法 */
abstract public mixed
current ( void )//返回当前元素
abstract public scalar
key ( void )//返回当前元素的键
abstract public void
next ( void )//向前移动到下一个元素
abstract public void
rewind ( void )//返回到迭代器的第一个元素
abstract public boolean
valid ( void )//检查当前位置是否有效
}
如上是php.net贴出来的iterator接口说明,整理一下我们需要的,我们可能一次查询处多条数据,每一条数据都需要实例为领域对象。我们来继承这个迭代器,对,有很多条数据,可以在继承迭代器的接口(命名为 abstract A)A 类的构造方法中传入我们查询出来的数组和对应的映射器,把这些分别放入私有变量中,想一下应该怎么改造这个A了,我们需要一个负责实例化领域和返回领域对象的方法(别忘了我们在构造方法中传入了数据映射器,映射器可以为我们实例化对象),OK,很明显了,我们需要使用映射器的来实例化领域对象,然后返回该领域对象,以供使用。这样做还有一个好处,持久化操作,我们甚至可以把他作为一个单例来使用,再添加一个增加领域对象的方法,于是所有的领域对象都静静地躺在内存里待命,可以拿来想要的一条,或者全部。对了,每一个对象都应该有自己的迭代器,这样更好,嗯。有个烦恼的问题,迭代器中可能有重复的数据,甚至是一些已经改过,但是内存中还未做修改,这回导致bug,甚至很难找到问题所在,嗯。。。。
ps: 20 公里来回骑行
70 个45度俯卧撑(7*10)
160 个108度屈腿卷腹(20*8)
35 个90度蹲起
领域模型与数据映射器(理解)
标签:
原文地址:http://www.cnblogs.com/zhaohaibo/p/5458625.html