Composite模式
来源:互联网 发布:java 注释 link 编辑:程序博客网 时间:2024/06/06 07:14
在开发时,如果遇到使用递归构建树状的组合结构,那么可以考虑使用Composite模式.Composite模式将对象组合成树形结构,来表示部分,整体的层次结构.
解决整合与部分可以被一致对待问题。
其类结构如图所示:
在Component中声明可所有管理子类对象的方法,因此实现Component接口的子类都有了Add,Remove等功能,这样叶子节点和枝节点对于外界没有区别;但是因为Leaf类本身不具备Add,Remove等功能,实现也没有意义.
在实现时,管理叶子节点需要容器,这里使用了vector.
//Component.h
//Component.h#ifndef _COMPONENT_H_#define _COMPONENT_H_class Component{public: Component(); virtual ~Component(); virtual void Operation() = 0; virtual void Add(const Component&); virtual void Remove(const Component&); virtual Component* GetChild(int);};#endif
//Component.cpp
//Component.cpp#include"Component.h"Component::Component(){}Component::~Component(){}void Component::Add(const Component& com){}void Component::Remove(const Component& com){}Component* Component::GetChild(int index){ return 0;}
//Composite.h
//Composite.h#ifndef _COMPOSITE_H_#define _COMPOSITE_H_#include"Component.h"#include<vector>class Composite :public Component{public: Composite(); ~Composite(); void Operation(); void Add(Component* com); void Remove(Component* com); Component* GetChild(int index);private: std::vector<Component*> comVec;};#endif
//Composite.cpp
//Composite.cpp#include"Component.h"#include"Composite.h"Composite::Composite(){}Composite::~Composite(){}void Composite::Operation(){ std::vector<Component*>::iterator comIter = comVec.begin(); for (; comIter != comVec.end(); comIter++) { (*comIter)->Operation(); }}void Composite::Add(Component* com){ comVec.push_back(com);}void Composite::Remove(Component* com){ std::vector<Component*>::iterator comIter = comVec.begin(); for (; comIter != comVec.end(); comIter++) { if (*comIter == com) { comVec.erase(comIter); return; } }}Component* Composite::GetChild(int index){ return comVec[index];}
//Leaf.h
//Leaf.h#ifndef _LEAF_H_#define _LEAF_H_#include"Component.h"class Leaf :public Component{public: Leaf(); ~Leaf(); void Operation();};#endif
//Leaf.cpp
//Leaf.cpp#include"Leaf.h"#include<iostream>Leaf::Leaf(){}Leaf::~Leaf(){}void Leaf::Operation(){ std::cout << "Leaf operation..." << std::endl;}
//main.cpp
//main.cpp#include"Component.h"#include"Composite.h"#include"Leaf.h"int main(){ Leaf* l = new Leaf(); l->Operation(); Composite *com = new Composite(); com->Add(l); com->Operation(); Component* ll = com->GetChild(0); ll->Operation(); return 0;}
0 0
- Composite模式
- composite 模式
- composite模式
- Composite模式
- Composite模式
- COMPOSITE 模式
- Composite模式
- Composite 模式
- Composite 模式
- Composite模式
- Composite模式
- Composite模式
- Composite模式
- composite模式
- composite模式
- Composite模式
- Composite模式
- Composite模式
- 短暂性解决http网络请求安全的问题(iOS的坑)
- LeetCode Weekly Contest 31解题思路
- 并发编程:volatile 关键字解析
- Google 面试题 | 判断字符串是否可由重复子字符串组成
- MFC CFolderPickerDialog 和CFileDialog选择文件路径
- Composite模式
- 时间显示格式
- 查看SELinux状态
- 数据结构-链栈
- angularjs生命周期的compile的 pre-link阶段都干了什么
- SQL_基础篇
- android各大手机系统打开权限管理页面
- Java通过反射调用方法
- Streamsql&&Kafka demo