组合模式,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让操作和行为局部化。