Windows应用开发中常用的设计模式
本文介绍一部分在Windows应用开发中常用的设计模式,值得一提的是在Windwos平台并不存在很多得到大家公认的模式,本文介绍的3种设计模式来源于Microsoft的网站和一些技术书籍。
本文主要介绍两种模式:Mike McClure (Microsoft)在MSDN上提出的Entity-Collection-Class(ECC)模式,以及Bryan Costanich从ECC模式衍生的Manager-Collection-Class(MCC)模式,其它的还有Wade Baron在《Designing Solutions With COM+ Technologies》中提到的CBOFramework请查阅文章末尾的参考资料。
Entity-Collection-Class模式Engine-Collection-Class 设计模式将一个实体组件分为Engine、Collection 和 Class 三个部分。Class为通常的业务/实体对象,具有属性,代表现实世界的实体。Engine 和 Collection 则提供用来管理和扩展其行为的方法。对于要被建模的实体,必须创建所有这三种元素。
图 1. ECC设计模式关系图
ECC 将实体的创建、存储和属性分离开,从而为业务对象提供了一种三层设计。ECC 设计模式使用面向对象的技术(如封装)和一些很流行的设计模式(如 Object Factory 和 Opaque Object Adapter)。
通常,Engine 实现一种称为 Object Factory 的设计模式,后者定义了一个用来创建其它对象的接口。在这种情况下,Engine 既创建Collection对象,也创建 Class 对象。以这种方式设计 Engine 提供了以下好处:
通过单个接口控制和强制对象的创建 提供检查和强制对象创建的安全性 提供客户机与 Collection 和 Class 对象之间的松散耦合,这可以增加新的功能而不影响客户机 用已知的有效状态强制对象的创建 Collection 实现一种称为 Opaque Object Adapter 的模式,后者允许一个对象私有地封装和使用另一个对象的接口和功能。正如图 2 所示的那样,Collection 包含对 ConcreteInternalStorage的一个引用。这称为合成。ConcreteInternalStorage 对象用于存储Class 对象,并且根据所提供功能的多少,它也可以用来为 Collection 提供扩展功能。数组、.Net Framework 的列表对象、字典对象和 ADO 记录集都是 ConcreteInternalStorage 对象的例子。这样实现Collection 提供下列好处:
实现的继承 通过更改 ConcreteInternalStorage对象增强功能 客户机和 Collection 的内部存储对象之间的松散耦合,允许对象变化对客户机产生最小的影响,或者根本没有影响 处理 Class 对象的能力(如计算总和、计数) Class 提供对实体数据的访问,它同时管理自身对象的状态,如Dirty,IsNew接口。图2是一个ECC模式的参考模型。
图 2. Engine-Collection-Class 模型
ECC模式实现比较复杂,完整的设计思想参看Engine-Collection-Class, a Design Pattern for Building Reusable Enterprise Components。
Manager-Collection-Class模式MCC是从ECC衍生而来,同ECC不同,ECC的Collection类负责具体实体的创建,而Engine提供该外部访问,在MCC模式中Collection仅仅用作对象的容器,而Manager即提供外部访问,在多数情况下又负责实体的维护,因此MCC模式实际上常常被用作MC模式(Manager-Class)。
创建一个完整的MCC模型,需要创建3个类:ObjectManager,ObjectCollection,Object。完整的业务实体图如下图:
下面的MCC模型图帮助理解3个类之间的关系
ObjectManager
ObjectManager管理数据的存储,包括获取、持久化、更新和删除对象或对象的集合。 ObjectManager管理数据存储,包括编写访问数据创建业务对象的代码,为了更大的重用,也可以考虑把处理的数据获取和持久化的功能抽象出来放在一个ObjectDataManager类中。
ObjectCollection
ObjectCollection继承至.NETd的框架类ArrayList(在C++也可以实现为Vector),它能够管理集合项,并且实现了IEnumerable(.NET框架类)接口,可以绑定到列表控件中。ObjectCollection类可以增加附加的方法,如根据对象的属性排序。ObjectCollection并不负责持久化性的管理,一般情况下ArrayList就能满足MCC对集合的要求,因此设计时可以更加简化。
Object
Object描述需要在对象上维护的数据的属性,例如User对象,这些对象并不与数据库连接。当对象的数据改变时,布尔标志IsDirty应当设定为true,Object自身并不知道怎样"保存"或"更新",它需要传回给ObjectManager类来实现这些功能。另外,ObjectCollection类的对象集合也能传递给ObjectManager来进行持久化的管理。
MCC模式的完整描述参看Engine-Collection-Class, a Design Pattern for Building Reusable Enterprise Components
参考资料书籍 《Designing Solutions With COM+ technologies》,Wade Baron,英文版
《COM+技术解决方案设计》,Wade Baron,机械工业出版社出版, 2001.09,中文版
文章 Engine-Collection-Class, a Design Pattern for Building Reusable Enterprise Components