设计模式--组合模式

 

 

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();
    
}

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值