将内部数据结构与客户代码隔离,不论内部结构是什么样子,客户代码调用方式不变(invokeAll函数)
component.h
#ifndef _THREAD_POOL_H
#define _THREAD_POOL_H
#include <list>
#include <string>
using namespace std;
class component
{
public:
component(int id, string name): m_id(id), m_name(name){}
virtual void doTask() = 0;
virtual ~component(){};
protected:
int m_id;
string m_name;
};
//相当于树的非叶子节点
class Composite :public component{
public:
void doTask()override;
void add(component *pComponent);
void remove(component *pComponent);
private:
list<component *> m_childs;
};
//相当于树的叶子节点
class Leaf :public component{
public:
void doTask()override;
};
void invokeAll(component * c);
#endif
component.cpp
#include "component.h"
#include <iostream>
using namespace std;
//类似于树的遍历
void Composite::doTask(){
printf("composit id: %d, name :%s do task\n", m_id, m_name.c_str());
for(auto &e : m_childs){
e->doTask();
}
}
void Composite::add(component *pComponent){
m_childs.push_back(pComponent);
}
void Composite::remove(component *pComponent){
m_childs.remove(pComponent);
}
void Leaf::doTask(){
printf("leaf id: %d, name :%s do task\n", m_id, m_name.c_str());
}
void invokeAll(component* c){
c->doTask();
}
main.cpp
#include "component.h"
using namespace std;
int main(){
Composite root(1, "root");
Composite left(2, "left");
Composite right(3, "right");
Leaf left_leaf1(4, "left_leaf1");
Leaf left_leaf2(5, "left_leaf2");
Leaf right_leaf1(6, "right_leaf1");
Leaf right_leaf2(7, "right_leaf2");
root.add(&left);
root.add(&right);
left.add(&left_leaf1);
left.add(&left_leaf2);
right.add(&right_leaf1);
right.add(&right_leaf2);
invokeAll(&root);
return 0;
};
``