设计模式--组合模式C++实现
组合模式C++实现
1定义
将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性
2类图
角色分析
Component抽象构建角色
定义参加组合独享的共同方法和属性,可以定义一些默认的行为或者属性
Leaf叶子结构,旗下没有分支,是最小的遍历单位
Composite树枝结构,作用是组合树枝节点和叶子结点形成的树形结构
3实现
class Component
{
protected:
Component();
public:
virtual ~Component() = 0;
//所有结点都有的共同信息
virtual void doSomething() = 0;
};
//树枝结构
class Composite :public Component
{
private:
list<Component> _comList = new list<Component>();
public:
//增加一个叶子构建或者树枝构建
void add(Component &Com)
{
_comList.push_back(Com);
}
void remove(Component &com)
{
_comList.remove(com);
}
list<Component> getChildren()
{
return _comList;
}
};
//树叶结构
class Leaf:public Component
{
public:
//覆盖父类方法
void doSomething()
{}
};
void display(Composite root)
{
//遍历root的孩子,
如果是叶子:打印
else
递归
}
void Test
{
Composite *root = new Composite();
root->doSomething();
composite *branch = new Composite();
Leaf* leaf = new Leaf();
root->add(branch);
root->add(leaf);
}
4应用
①优点
高层模块调用简单,所有结点都是Component ,局部和整体对调用者来说没有任何区别,高层不必关心自己处理的是单个对象还是整个组合结构
结点自由增加,使用组合模式,如果想增加树枝节点,树叶结点都很容易,只要找到父节点就行,符合开闭原则
②缺点
树枝和树叶结点使用时的定义,直接使用的是实现类。违背依赖倒置原则
③使用场景
维护和展示一部分-整体关系的场景:eg树形菜单,文件和文件夹管理
从一个整体中能够独立出部分模块和功能的场景
④注意事项
只要是树形结构,就考虑组合模式,只要体现这你部分关系,就使用组合模式
5扩展
①项目中常用的一种:由文件中的职员表项简历数据结构。能够通过for和递归直接创建结构
②组合模式:
a安全模式-如上
b透明模式-把用来组合使用的方法放在抽象类中,eg:add,remove,getChild
所以:叶子节点和树枝节点都继承得到以上方法,只是叶子节点内部空实现,什么也不做。。这样做的好处是,客户端遍历直接多态化,不用类型转换。
6提升
对于这个组合模式,可能存在随机访问的问题,那么 增加一个父指针,实现目标即可