【设计模式】组合模式

 

 

设计模式  组合模式

 

将对象合成树型结构以表示【部分-整体】的层次结构。组合模式使得用户对单个对象
和组合对象的使用具有一致性。
当发现需求中是体现部分与整体层次的结构时,以及你希望用户可以忽略组合对象与
单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑组合模式。

从编码上看,【组合模式】至少包含这几个部分:
1、一个只包含接口的类CComponent

2、一个继承自CComponent类的子类,该类实现了父类的所有接口,并且有一个父类
对象(C++里应该是指针)的集合,用来在运行时多态的调用CComponent其他子类的函数

3、若干个其他继承自CComponet的子类,实现了父类的所有接口

 

 

 

复制代码
************************************************************************/
/* 设计模式
组合模式
将对象合成树型结构以表示【部分-整体】的层次结构。组合模式使得用户对单个对象
和组合对象的使用具有一致性。
当发现需求中是体现部分与整体层次的结构时,以及你希望用户可以忽略组合对象与
单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑组合模式。

从编码上看,【组合模式】至少包含这几个部分:
1、一个只包含接口的类CComponent

2、一个继承自CComponent类的子类,该类实现了父类的所有接口,并且有一个父类
对象(C++里应该是指针)的集合,用来在运行时多态的调用CComponent其他子类的函数

3、若干个其他继承自CComponet的子类,实现了父类的所有接口
/************************************************************************/


#include "stdafx.h"
#include <list>
#include <string>
using namespace std;
#include <iostream>


//抽象基类,只包含若干接口
class CComponent
{
public:
    CComponent(string strCompanyName);
    virtual ~CComponent();
    virtual void Add(CComponent* pComponent) = 0;
    virtual void Remove() = 0;
    virtual void Work() = 0;                      //工作函数

protected:
    string m_strCompanyName; 
};

CComponent::CComponent(string strCompanyName) : m_strCompanyName(strCompanyName)
{}
CComponent::~CComponent()
{
}
复制代码

 

 

 

 

 

复制代码
//用来管理其他子类的类,实现了所有父类的接口
//有一个包含父类对象(指针)的集合
class CComposite : public CComponent
{
public:
    CComposite(string strCompanyName);
    virtual ~CComposite();
    virtual void Add(CComponent* pComponent);
    virtual void Remove();
    virtual void Work();                 //工作函数,运行时被不尽相同的类对象调用

protected:
    list<CComponent*> m_lstComponents;   //父类指针的集合,运行时多态

};

CComposite::CComposite(string strCompanyName) : CComponent(strCompanyName)
{
}
CComposite::~CComposite()
{
}

void CComposite::Add(CComponent* pComponent)
{
    m_lstComponents.push_back(pComponent);
}

void CComposite::Remove()
{
}

void CComposite::Work()
{
    for (list<CComponent*>::const_iterator iter = m_lstComponents.begin(); 
        iter != m_lstComponents.end(); ++ iter)
    {
        if(NULL != *iter)
            (*iter)->Work();
    }
}
复制代码

 

 

 

 

 

复制代码
//抽象基类的一个具体子类,实现的接口中只包含跟自己业务有关的代码
//不用管其他子类
class A : public CComponent
{
public:
    A(string strName);
    virtual ~A();
    virtual void Add(CComponent* pComponent);
    virtual void Remove();
    virtual void Work(); 
};

A::A(string strName) : CComponent(strName)
{
}

A::~A()
{

}

void A::Add(CComponent* pComponent)
{ 
}

void A::Remove()
{ 
}

void A::Work()
{
    cout << m_strCompanyName << "::A::work-------" << endl; 
}
复制代码

 

 

 

 

复制代码
//抽象基类的另一个具体子类,实现接口时也只包含跟自己业务有关的代码
//而不用管其他具体子类
class B : public CComponent
{
public:
    B(string strName);
    virtual ~B();
    virtual void Add(CComponent* pComponent);
    virtual void Remove();
    virtual void Work();
};

B::B(string strName) : CComponent(strName)
{

}

B::~B()
{

}

void B::Add(CComponent* pComponent)
{

}
void B::Remove()
{

}

void B::Work()
{
    cout << m_strCompanyName << "::B::work**********" << endl; 
}
复制代码

 

 

 

 

复制代码
int _tmain(int argc, _TCHAR* argv[])
{
    //obj1
    CComposite obj1("obj1");
    A a("1a");
    B b("1b");

    //obj2
    CComposite obj2("obj2");
    A aa("2a");
    B bb("2b");
    
    obj1.Add(&obj2);
    obj1.Add(&a);
    obj1.Add(&b);

    obj2.Add(&aa);
    obj2.Add(&bb);
 
    obj1.Work();

    /************************************************************************/
    /* obj1
       ----obj2
       --------aa
       --------bb
       ----a
       ----b

    /************************************************************************/



    return 0;
}
复制代码

 

 

 

 

运行结果

 

posted on   崔好好  阅读(255)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示