组合模式,Composite:上一篇中提过,和职责链模式结合使用。
定义:将对象以树形结构组织起来,以达成“部分-整体”的层次结构,使得客户端对单个对象和组合对象的使用具有一致性。
组成:
抽象构件:为组合中的对象声明接口,也可以提供接口的缺少行为。
树叶构件:在组合中表示叶子节点对象,没有子节点。实现抽象构件中的接口。
树枝构件:在组合中表示分支节点对象,有子节点。实现抽象构件中的接口,并存储子构件。
这也是一个普遍应用的设计模式,浏览器UI框架中的控件就是这样的一个树状结构:父控件,子控件,子控件下面还可以放入再下一层子控件。
示例代码:
//Composite,这是一个单元测试框架 class TestResult { /*测试结果信息,略*/ public: bool iShouldStop; }; //抽象构件 class Test { public: virtual void RunTest(TestResult& aRes) = NULL; virtual void AddTest(Test* aTest) { iTestList.Append(aTest); } virtual void RemoveTest(){ /*从表中删除略*/ } protected: RPointerArray<Test> iTestList;//动态数组 }; //树枝构件 class TestSuite : public Test { public: void RunTest(TestResult& aRes) { //遍历数组,调用所有RunTest for (TInt i = 0; i < iTestList.Count(); i++) { Test* test = iTestList[i]; test->RunTest(aRes); if (aRes.iShouldStop) return; } } private: }; //叶子构件 class TestCase : public Test { public: void RunTest(TestResult& aRes) { /*做测试,修改TestResult*/ } };
Composite模式几乎在所有面向对象系统中都有使用。
相关模式:
职责链Respoinsibility of Chain模式、修饰Decorator模式、Flyweight让你共享组件、Itertor可用来遍历、Visitor让操作和行为局部化。