整套网站建设视频教程,深圳优化公司找高粱seo服务,高端品牌网站建设费用,直接玩的网页游戏文章目录 1 、组合模式#xff08;Composite Pattern#xff09;概述2. 组合模式的结构3. C 代码示例4. C示例代码25 .应用场景 1 、组合模式#xff08;Composite Pattern#xff09;概述
定义#xff1a;组合模式是一种结构型设计模式#xff0c;它允许你将对象组合成… 文章目录 1 、组合模式Composite Pattern概述2. 组合模式的结构3. C 代码示例4. C示例代码25 .应用场景 1 、组合模式Composite Pattern概述
定义组合模式是一种结构型设计模式它允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。作用 简化客户端代码客户端可以统一地处理单个对象和对象组合而不需要区分它们是单个的叶子节点还是包含多个子节点的组合节点。例如在一个文件系统的表示中客户端可以用相同的方式来处理文件叶子节点和文件夹组合节点如计算文件大小或显示文件/文件夹名称等操作。层次结构表示能够很好地表示具有层次结构的对象关系。比如公司的组织结构一个部门组合节点可以包含多个子部门和员工叶子节点通过组合模式可以清晰地构建和遍历这种层次结构。灵活的对象组合可以方便地添加新的叶子节点或组合节点构建出复杂的对象树并且可以动态地修改这个树的结构而不影响客户端对树的整体操作。
2. 组合模式的结构
组件Component这是组合模式中的抽象类或接口它为组合中的对象包括叶子节点和组合节点定义了统一的接口如操作方法、添加子节点方法对于组合节点、删除子节点方法对于组合节点等。叶子Leaf叶子节点是组合中的最底层对象它没有子节点实现了组件接口定义的方法但不包含添加或删除子节点相关的操作因为它本身不能再包含其他对象。组合Composite组合节点代表了包含子节点的对象它实现了组件接口并且内部维护了一个子节点列表。它的方法实现通常是遍历子节点列表调用子节点的相应方法来完成操作同时也实现添加和删除子节点的方法来管理子节点列表。
3. C 代码示例
以下以一个简单的图形绘制系统为例图形可以是简单的基本图形如圆形、矩形相当于叶子节点也可以是由多个图形组成的复杂图形相当于组合节点。
#include iostream
#include vector// 组件抽象类
class Graphic
{
public:virtual void draw() 0;virtual ~Graphic() {}
};// 叶子节点圆形
class Circle : public Graphic
{
public:void draw(){std::cout 绘制圆形 std::endl;}
};// 叶子节点矩形
class Rectangle : public Graphic
{
public:void draw(){std::cout 绘制矩形 std::endl;}
};// 组合节点复杂图形
class ComplexGraphic : public Graphic
{
private:std::vectorGraphic* graphics;
public:void draw(){for (std::vectorGraphic*::iterator it graphics.begin(); it! graphics.end(); it){(*it)-draw();}}void add(Graphic* graphic){graphics.push_back(graphic);}void remove(Graphic* graphic){for (std::vectorGraphic*::iterator it graphics.begin(); it! graphics.end(); it){if (*it graphic){graphics.erase(it);break;}}}~ComplexGraphic(){graphics.clear();}
};int main()
{// 创建叶子节点图形Circle circle;Rectangle rectangle;// 创建组合节点图形并添加叶子节点图形ComplexGraphic complexGraphic;complexGraphic.add(circle);complexGraphic.add(rectangle);// 绘制组合图形会依次绘制组合中的所有图形complexGraphic.draw();return 0;
}在上述代码中
Graphic是组件抽象类定义了draw方法作为统一的接口用于绘制图形。Circle和Rectangle是叶子节点类它们分别实现了draw方法来绘制具体的基本图形。ComplexGraphic是组合节点类内部维护了一个Graphic指针的向量来存储子图形。draw方法通过遍历子图形向量并调用每个子图形的draw方法来绘制整个复杂图形add和remove方法用于管理子图形列表。在main函数中首先创建了基本图形对象然后创建了复杂图形对象并添加基本图形对象到其中最后通过调用复杂图形对象的draw方法来绘制整个组合图形展示了组合模式在图形绘制系统中的简单应用。
4. C示例代码2
#includeiostream
#includelist
#includestring
using namespace std;
//将对象组合成树形结构以表示“部分-整体”的层次结构。
//组合模式使得用户对单个对象和组合对象的使用具有一致性class Company
{
public:Company(string name) { m_name name; }virtual ~Company(){}virtual void Add(Company *pCom){}virtual void Show(int depth) {}
protected:string m_name;
};
//具体公司
class ConcreteCompany : public Company
{
public:ConcreteCompany(string name): Company(name) {}virtual ~ConcreteCompany() {}void Add(Company *pCom) { m_listCompany.push_back(pCom); } //位于树的中间可以增加子树void Show(int depth){for(int i 0;i depth; i){cout-;}coutm_nameendl;listCompany *::iterator iterm_listCompany.begin();for(; iter ! m_listCompany.end(); iter) //显示下层结点{(*iter)-Show(depth 2);}}
private:listCompany * m_listCompany;
};
//具体的部门财务部
class FinanceDepartment : public Company
{
public:FinanceDepartment(string name):Company(name){}virtual ~FinanceDepartment() {}virtual void Show(int depth) //只需显示无限添加函数因为已是叶结点{for(int i 0; i depth; i){cout-;}coutm_nameendl;}
};
//具体的部门人力资源部
class HRDepartment :public Company
{
public:HRDepartment(string name):Company(name){}virtual ~HRDepartment() {}virtual void Show(int depth) //只需显示无限添加函数因为已是叶结点{for(int i 0; i depth; i){cout-;}coutm_nameendl;}
};int main()
{Company *root new ConcreteCompany(总公司);Company *leaf1new FinanceDepartment(财务部);Company *leaf2new HRDepartment(人力资源部);root-Add(leaf1);root-Add(leaf2);//分公司ACompany *mid1 new ConcreteCompany(分公司A);Company *leaf3new FinanceDepartment(财务部);Company *leaf4new HRDepartment(人力资源部);mid1-Add(leaf3);mid1-Add(leaf4);root-Add(mid1);//分公司BCompany *mid2new ConcreteCompany(分公司B);FinanceDepartment *leaf5new FinanceDepartment(财务部);HRDepartment *leaf6new HRDepartment(人力资源部);mid2-Add(leaf5);mid2-Add(leaf6);root-Add(mid2);root-Show(0);delete leaf1; delete leaf2;delete leaf3; delete leaf4;delete leaf5; delete leaf6;delete mid1; delete mid2;delete root;return 0;
}输出
总公司
--财务部
--人力资源部
--分公司A
----财务部
----人力资源部
--分公司B
----财务部
----人力资源部
请按任意键继续. . .
组合模式让客户一致的使用组合结构和单个对象他们的接口是统一透明的这样用户就无须做判断然后根据不同的结果去执行不同的动作了。
5 .应用场景
文件系统和目录结构表示 描述层次关系文件系统是典型的树形层次结构由文件叶子节点和文件夹组合节点组成。组合模式可以很好地对其进行建模。例如在操作系统的文件管理器中每个文件夹可以包含文件和子文件夹使用组合模式可以用统一的方式处理文件和文件夹的操作如计算文件夹大小需要递归计算子文件夹和文件的大小、显示文件和文件夹列表、复制或移动文件夹包括其内部的所有文件和子文件夹等操作。权限管理对于文件系统的访问权限设置权限可以从文件夹继承到文件。通过组合模式可以方便地为文件夹组合节点设置权限并将这些权限传播给其包含的文件叶子节点和子文件夹确保整个文件系统层次结构的权限一致性。 图形用户界面GUI组件层次结构 构建界面布局在GUI设计中窗口、面板如容器面板是组合节点而按钮、文本框等是叶子节点。组合模式用于构建复杂的用户界面布局。例如一个窗口可以包含多个面板每个面板又可以包含按钮、文本框等各种控件。通过组合模式可以方便地添加、删除或重新排列这些界面组件并且可以对整个界面或部分组件进行统一的操作如显示、隐藏、设置样式等。事件处理和消息传递在GUI系统中事件如鼠标点击、键盘输入需要在组件层次结构中传播。组合模式可以帮助实现事件从顶层窗口向下传递到具体的叶子节点组件或者从底层组件向上冒泡到父容器组件从而实现合理的事件处理机制。 组织结构和资源管理 企业组织结构建模企业的组织结构是一个层次分明的体系包括部门组合节点和员工叶子节点。组合模式可以用于表示这种组织结构方便进行资源分配、任务分配等操作。例如人力资源部门可以通过组合模式表示的组织结构为整个公司根节点或者某个部门子组合节点统一进行工资核算、培训安排等操作这些操作可以递归地应用到部门内的所有员工叶子节点。计算机集群资源管理在计算机集群环境中集群组合节点由多个计算节点叶子节点组成。通过组合模式可以对集群资源进行统一管理如分配任务到集群将任务分配到具体的计算节点、监控集群状态包括各个计算节点的状态、进行软件安装和更新在集群范围内或者部分计算节点范围内等操作。 游戏开发中的场景和对象管理 游戏场景构建游戏场景通常包含各种游戏对象如角色叶子节点、道具叶子节点和地形组合节点可能包含多个子地形区域等。组合模式可以用于构建游戏场景方便游戏开发者添加、删除或修改游戏场景中的对象。例如在一个角色扮演游戏中可以通过组合模式创建一个包含多个区域组合节点的大地图场景每个区域又包含角色、道具等对象对整个场景或者部分区域的操作如渲染、碰撞检测等可以通过组合模式统一进行。游戏对象层次关系处理游戏中的一些对象可能具有父子关系如角色装备叶子节点与角色本身组合节点。通过组合模式可以更好地处理这种对象层次关系例如当角色移动时其装备也随之移动当角色受到攻击时其装备的属性如防御值可以对攻击进行响应这种对象之间的关联和操作可以通过组合模式来清晰地实现。