组合模式
时间: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行还是有点错误,暂时没找出来,所以删除函数还不能用。
- 机器学习的技术栈及应用实例脑洞
- Ryu:OpenFlow协议源码分析
- 详解 LSTM
- 并发系列:从原子更新到CPU锁
- 前后端分离之vue2.0+webpack2 实战项目 -- webpack介绍
- 神经网络 之 感知器的概念和实现
- 图解ByteBuffer
- TensorFlow-1: 如何识别数字
- 你应该知道的Java垃圾收集器 - 串行、并行、CMS、G1
- ckplayer 如何在PC上完美支持 m3u8播放
- TensorFlow-2: 用 CNN 识别数字
- js图片前端预览之 filereader 和 window.URL.createObjectURL
- TensorFlow-3: 用 feed-forward neural network 识别数字
- TensorFlow-4: tf.contrib.learn 快速入门
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 用Python打造一款文件搜索工具,所有功能自己定义!
- 用Python绘制诱人的桑基图,一眼看透熬夜和狗粮的秘密
- magento换域名和服务器要怎么操作
- 从零搭建SpringBoot+MyBatis+MySQL工程
- 从零搭建SpringBoot+MyBatis+MySQL
- Typescript 使用日志(干货)
- 22+ 高频实用的 JavaScript 片段 (2020年)
- VSCode 的这些黑科技 99% 的人都不知道
- YOLOv4 中的 Mish 激活函数
- pdbsplit将多个chain的pdb文件分割
- rk3399 wifi和eth0共存 调试
- 23条JavaScript初学者应知的最佳实践方法
- 黑板客爬虫闯关游戏
- Python自学成才之路 多进程开发
- Python自学成才之路 进程间通信