组合模式

时间:2022-04-26
本文章向大家介绍组合模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

一、简介

1、组合模式将对象组合成树形结构以表示‘部分和整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

2、模式中的几个重要的类

Component:组合中的对象声明接口,在适当情况下,实现所有类共有接口的行为。

Leaf:叶节点对象,叶节点没有子节点。由于叶节点不能增加分支和树叶,所以叶节点的Add和Remove没有实际意义。

Composite:实现Componet的相关操作,比如Add和Remove操作。

3、UML

4、所属类别:结构型

二、C++代码

 1 // 组合模式.cpp : 定义控制台应用程序的入口点。
 2 //
 3 
 4 #include "stdafx.h"
 5 #include<iostream>
 6 #include<string>
 7 #include<vector>
 8 using namespace std;
 9 
10 class Component
11 {
12 public:
13     Component(){}
14     virtual ~Component(){}
15     virtual void add(Component *)=0;
16     virtual void remove(Component *)=0;
17     virtual void display(int jibie)=0;//为了看清楚树形关系而设置的显示函数
18 };
19 class Leaf:public Component
20 {
21 private:
22     string name;
23 public:
24     Leaf(string n)
25     {
26         name=n;
27     }
28     ~Leaf(){}
29     virtual void add(Component* a)
30     {
31         cout<<"最底层不能再添加部门"<<endl;
32     }
33     virtual void remove(Component* a)
34     {
35         cout<<"最底层没有可以删除的部门"<<endl;
36     }
37     virtual void display(int jibie)
38     {
39         for(int i=0;i<jibie;i++)
40         {
41             cout<<'-';
42         }
43         cout<<name<<endl;
44     }
45 };
46 class Composite:public Component
47 {
48 private:
49     vector<Component*> com;
50     string name;
51 public:
52     Composite(string n)
53     {
54         name=n;
55     }
56     virtual ~Composite(){}
57     virtual void add(Component* a)
58     {
59         com.push_back(a);
60     }
61     virtual void remove(Component*a)
62     {
63         //com.erase(a);
64     }
65     virtual void display(int num)
66     {
67         for(int i=0;i<num;i++)
68         {
69             cout<<'-';
70         }
71         cout<<name<<endl;
72         num=num+2;
73         vector<Component*>::iterator it;
74         for(it=com.begin();it!=com.end();it++)
75         {
76             (*it)->display(num);
77         }
78     }
79 };
80 
81 int _tmain(int argc, _TCHAR* argv[])
82 {
83     Component *root=new  Composite("河海大学");
84     Component *changzhouxiaoqu=new Composite("河海大学常州校区");
85     Component *wulianwang=new Composite("河海大学常州校区物联网工程学院");
86     Component *jidiangongcheng=new Composite("河海大学常州校区机电工程学院");
87     root->add(changzhouxiaoqu);
88     changzhouxiaoqu->add(wulianwang);
89     changzhouxiaoqu->add(jidiangongcheng);
90     root->display(1);
91     return 0;
92 }

注意:程序中63行还是有点错误,暂时没找出来,所以删除函数还不能用。