结构型模式之组合模式(Composite)

xiaoxiao2021-02-28  45

1. 意图 将对象组合成树形结构以表示“部分-整体”的层次结构。C o m p o s i t e使得用户对单个对象和组合对象的使用具有一致性。 2. 动机 在绘图编辑器和图形捕捉系统这样的图形应用程序中,用户可以使用简单的组件创建复杂的图表。用户可以组合多个简单组件以形成一些较大的组件,这些组件又可以组合成更大的组件。一个简单的实现方法是为Te x t和L i n e这样的图元定义一些类,另外定义一些类作为这些图元的容器类( C o n t a i n e r )。 然而这种方法存在一个问题:使用这些类的代码必须区别对待图元对象与容器对象,而实际上大多数情况下用户认为它们是一样的。对这些类区别使用,使得程序更加复杂。

C o m p o s i t e模式描述了如何使用递归组合,使得用户不必对这些类进行区别,如下图所示。

C++举例:

#ifndef COMPOSITE #define COMPOSITE #include <string> #include <vector> #include <iostream> using std::string; using std::vector; using std::cout; using std::endl; class CFolder{ protected: string m_strName; public: CFolder(string str) : m_strName(str) {} virtual void Add(CFolder* pFolder){} virtual void Remove(){} virtual void Show(){cout<<m_strName<<endl;} virtual void Display(){Show();} }; class CConcreateFolder : public CFolder{ private: vector<CFolder*> vFolderList; public: CConcreateFolder(string str) : CFolder(str){} virtual void Add(CFolder* pFolder){ vFolderList.push_back(pFolder); } virtual void Display(){ for(vector<CFolder*>::iterator it=vFolderList.begin();it!=vFolderList.end();it++){ (*it)->Show(); } cout<<endl; } }; class CTxt : public CFolder{ public: CTxt(string str) : CFolder(str){} }; class CPic : public CFolder{ public: CPic(string str) : CFolder(str){} }; class CMovie : public CFolder{ public: CMovie(string str) : CFolder(str){} }; #endif #include <iostream> #include "composite.h" int main(){ CFolder* pRoot=new CConcreateFolder("MainDisk"); pRoot->Add(new CMovie("FastAndFurious.rmvb")); pRoot->Add(new CTxt("Diary.txt")); pRoot->Add(new CPic("Beauty.jpg")); CFolder* pSub=new CConcreateFolder("Study"); pRoot->Add(pSub); pSub->Add(new CTxt("Math.txt")); pSub->Add(new CMovie("Teacher.mp4")); pRoot->Show(); pRoot->Display(); pSub->Show(); pSub->Display(); return 0; }

转载请注明原文地址: https://www.6miu.com/read-19289.html

最新回复(0)