1. 什么是组合模式?
对于以树形结构组织起来的单个对象和对象组合(“部分-整体”),客户端操作具有的一致性。
2. 为什么要使用适配器模式?
优点:
1)使客户端调用简单,客户端可以一致的使用组合结构或其中单个对象,用户就不必关心自己处理的是单个对象还是整个组合结构,这就简化了客户端代码。
2)对象的增加,符合开闭原则。对系统的二次开发和功能扩展很有利。
缺点:
1)组合模式不容易新加接口,比如用于业务复杂的对象。
2)叶子对象用不到父类的所有接口。
3. 组合模式使用原则
1)需要表示整体和部分层次,在整体和部分的层次结构中,希望通过一种方式忽略整体与部分的差异,可以一致地对待它们。
2)让客户能够忽略不同对象层次的变化,客户端可以针对抽象构件编程,无须关心对象层次结构的细节。
4. uml图
其中IObject是叶子和节点的共同父类。声明了共有的接口。
IObject::getChlid()通过判断是否有子组件,来区分叶子和节点。
5. 代码
#include <iostream>
#include <stdio.h>
#include <list>
using namespace std;
class IObject
{
public:
IObject(){}
virtual ~IObject(){}
virtual void oper(){};
virtual void add(IObject*){};
virtual bool hasChild(int index){};
};
class CLeaf:public IObject
{
public:
CLeaf(int num):m_num(num){}
~CLeaf(){}
virtual void oper()
{
std::cout<<" "<<"CLeaf::oper"<< m_num << std::endl;
}
virtual bool hasChild(int index)
{
return false;
}
private:
int m_num;
};
class CNode:public IObject
{
public:
CNode(int num):m_num(num){}
~CNode(){}
virtual void oper()
{
std::cout<<" "<<"CNode::oper" << m_num <<std::endl;
std::list<IObject*>::iterator it = m_list.begin();
for(;it != m_list.end();it++)
{
(*it)->oper();
}
}
virtual void add(IObject* obj)
{
m_list.push_back(obj);
}
virtual bool hasChild(int index)
{
if(index < 0 || index > m_list.size())
{
return false;
}
else
{
return true;
}
}
private:
int m_num;
std::list<IObject*> m_list;
};
int main()
{
CLeaf leaf1(1);
CLeaf leaf2(2);
CLeaf leaf3(3);
CLeaf leaf4(4);
CNode node1(1);
node1.add(&leaf1);
node1.add(&leaf2);
CNode root(0);
root.add(&node1);
root.add(&leaf3);
root.add(&leaf4);
root.oper();
node1.oper();
}