问答题 阅读下列说明和C++代码,在 (n) 处填入适当的字句。
[说明]
现欲构造一文件/目录树,采用组合(Composite)设计模式来设计,得到的类图如10.16所示。
【正确答案】(1) this->name (2) list<AbstractFile*>* (3) null (4) this->name (5) &childList
【答案解析】[要点解析] 这种类型的题需要对所考查的设计模式有一定的了解。如本题的组合设计模式,该模式的基本思想是将对象以树型结构组织起来,以达成“部分一整体”的层次结构。这种模式的优点在于:使客户端调用简单,客户端可以一致地使用组合结构或其中单个对象,用户就不必关心自己处理的是单个对象还是整个组合结构,这就简化了客户端代码。同时这种模式使得在组合体内加入对象部件变得更容易,客户端不必因为加入了新的对象部件而更改代码。题目中的实现主题正是“构造一文件/目录树”,这是组合设计模式的经典实例。
下面给出程序解释:
File(string name){(1)this->name=name;}/*this指针是一个隐含的指针,它指向对象本身,代表了对象的地址。此处是类file的构造函数,用于构造指定名称的文件。*/
第(2)空和第(3)空的解析: (2)list<AbstractFile*>*>*getChildren(){return (3)null;}/*类AbstractFile中的virtual list<AbstractFile*> *getChildren()=0;用于获得一个目录的子目录或文件,可知此处函数getChildren()的类型。再由函数addChild()和removeChild()返回值为空,而且file类即是树中的叶子节点,它不可能包含子节点,因此应返回空。*/
Folder(string name){ (4)this->name =name,}/*this指针是一个隐含的指针,它指向对象本身,代表了对象的地址。此处是类folder的构造函数,用于构造指定名称的文件目录。*/
list<AbstractFile*>*getChildren(){return (5)&childList;}/* 由 函 数 addChild()和removeChild()中的实现代码,再由类Folder中定义的list <AbstractFile*> childList;存储子目录或文件,可知此处应返回childList的地址,用以获取子目录或文件。*/
下面再给出程序的其他解释,帮助考生理解程序。
Composite模式是构造型的设计模式之一,通过递归手段来构造诸如文件系统之类的树型的对象结构;Composite模式所代表的数据构造是一群具有统一接口界面的对象集合,并可以通过一个对象来访问所有的对象(遍历)。
Component(此题中对应AbstractFile)是树型结构的节点抽象,为所有的对象定义统一的接口(公共属性,行为等的定义),提供管理子节点对象的接口方法,[可选]提供管理父节点对象的接口方法。
Leaf(此题中对应file)树型结构的叶子节点,是Component的实现子类。Composite(此题中对应folder)是树型结构的枝节点,也是Component的实现子类。