存储 频道

命令模式实现对象存储 对象与关系数库

  ⑴.命令模式解决方案描述。

  命令抽象类说明所有具体命令(ConcreteCommand)支持的接口,具体命令(ConcreteCommand)封装了接收者(Receiver)使用的服务。客户创建具体命令(ConcreteCommand),并将这些具体命令(ConcreteCommand)绑定在指定的接收者(Receiver)上,调用者(Invoker)实际执行一条命令或取消一条命令的执行。

  ⑵.命令模式结论:

  ①命令对象和命令算法被分离;

  ②调用者(Invoker)从指定的命令中分离出来并得到保护;

  ③具体命令(ConcreteCommand)是对象,它们可以进行创建和存储;

  ④在无须修改代码的前提下,新的具体命令(ConcreteCommand)可以被增加进来。

m_Storage.SetConnString("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Book.mdb");
if(!m_Storage.Initialize() MessageBox("存储系统初始化失败!");
//借书功能测试
  CBorrowBook borrowbook;   //借书类与图书类之间的关联视图
  CBorrow   borrow;      //借书类
  borrowbook.SetBookNumber("10001");
  if(!m_Storage.ReadEntity(&borrowbook)) break;
  borrow. SetPersonName(borrowbook.GetPersonName());
borrow. SetBorrowDate(borrowbook.GetPersonName());
  if(m_Storage.SaveEntity(&borrow)) MessageBox("借书成功");
……//查找书价>90元的图书
CEntitySet<CBook> books("book");
  books.SetConn(m_Storage.GetConn());
CBook* pBook = NULL;
  books.SetSQLString("price>90");
  books.Execute();
  int count = books.GetSize();
  m_ListCtrl.DeleteAllItems();    //列表视图控制
  for(int index = 0; index < count; index++)
  {
    pBook = books[index];
    m_ListCtrl.InsertItem(index, pBook->GetBookNumber());
……
}    

  总结

  从上面的设计和源程序中可以看出,CStorage类和CEntitySet类并没有访问和操纵数据库记录集,数据库的存取操作实际上由实体对象来完成,这样对于不同的实体对象和数据表结构,系统都可以正常工作,且即使增加新的实体对象也不会影响模块本身结构的稳定性。


  实体对象是对应用域中概念的描述,它只应该向外提供属性(或字段)赋值与读取操作,其数据库操作接口应声明为私有成员,不应该向应用系统提供。为了保证CStorage类和CEntitySet类可以向数据库存取实体对象,本模块根据C++多态特性,在这两个类中用指向CEntity类的指针来调用实体对象的存取接口,这样在实体对象将数据库存取接口声明为私有成员后,整个模块仍能正常工作。

  附注

  实体对象名必须与数据表名相同。

  本模块的并不仅限于用C++语言实现,使用Java和C#同样可以完成。

  本模块作适当调整,可以适用其他的数据访问模型,如ODBC、DAO。

  使用对象存储,数据库操作性能会略有下降,这也和实体类的具体实现有关。

  开发环境为VC6。

0
相关文章