`

[结构型模式] 组合模式的理解

 
阅读更多



头文件
//CompositePattern.h

#ifndef COMPOSITE_PATTERN_H
#define COMPOSITE_PATTERN_H

#include <Windows.h>
#include <iostream>
#include <string>
#include <vector>
using namespace std;

namespace CompositePattern
{
    //
    //////////////////////////////////////////////////////////////////////////
    class Component
    {
    public:
        Component(string name);
        virtual ~Component();
        virtual void Operation() = 0;
        virtual void Add(Component *) = 0;
        virtual void Remove(Component *) = 0;
        virtual Component *GetChild(int) = 0;
        virtual string GetName();
        virtual void Print() = 0;
    protected:
        string m_strCompname;
    };

    class Leaf : public Component
    {
    public:
        Leaf(string name);
        virtual void Operation();
        virtual void Add(Component *pComponent);
        virtual void Remove(Component *pComponent);
        virtual Component *GetChild(int index);
        virtual void Print();
    };
    class Composite : public Component
    {
    public:
        Composite(string name);
        virtual ~Composite();
        virtual void Operation();
        virtual void Add(Component *pComponent);
        virtual void Remove(Component *pComponent);
        virtual Component *GetChild(int index);
        virtual void Print();

    private:
        vector<Component*> m_vecComp;
    };

    //////////////////////////////////////////////////////////////////////////
    void CompositePattern_Test();
}

#endif


实现
#include "CompositePattern.h"
#include <iostream>
using namespace std;

namespace CompositePattern
{
    //////////////////////////////////////////////////////////////////////////
    Component::Component(string name)
        : m_strCompname(name)
    { }

    Component::~Component(){}

    //////////////////////////////////////////////////////////////////////////
    string Component::GetName()
    {
        return m_strCompname;
    }

    Leaf::Leaf(string name) : Component(name)
    {}
    void Leaf::Operation()
    {
        cout<<"I'm "<<m_strCompname<<endl;
    }
    void Leaf::Add(Component *pComponent){}
    void Leaf::Remove(Component *pComponent){}
    Component* Leaf::GetChild(int index)
    {
        return NULL;
    }
    void Leaf::Print(){}


    //////////////////////////////////////////////////////////////////////////
    Composite::Composite(string name)
        : Component(name)
    {}

    Composite::~Composite()
    {
        vector<Component *>::iterator it = m_vecComp.begin();
        while (it != m_vecComp.end())
        {
            if (*it != NULL)
            {
                cout<<"----delete "<<(*it)->GetName()<<"----"<<endl;
                delete *it;
                *it = NULL;
            }
            m_vecComp.erase(it);
            it = m_vecComp.begin();
        }
    }
    void Composite::Operation()
    {
        cout<<"I'm "<<m_strCompname<<endl;
    }
    void Composite::Add(Component *pComponent)
    {
        m_vecComp.push_back(pComponent);
    }
    void Composite::Remove(Component *pComponent)
    {
        for (vector<Component *>::iterator it = m_vecComp.begin(); it != m_vecComp.end(); ++it)
        {
            if ((*it)->GetName() == pComponent->GetName())
            {
                if (*it != NULL)
                {
                    delete *it;
                    *it = NULL;
                }
                m_vecComp.erase(it);
                break;
            }
        }
    }
    Component* Composite::GetChild(int index)
    {
        if (index > m_vecComp.size())
        {
            return NULL;
        }
        return m_vecComp[index - 1];
    }
    void Composite::Print()
    {
        for (vector<Component *>::iterator it = m_vecComp.begin(); it != m_vecComp.end(); ++it)
        {
            cout<<(*it)->GetName()<<endl;
        }
    }


    //////////////////////////////////////////////////////////////////////////
    void CompositePattern_Test()
    {
        Component *pNode = new Composite("Beijing Head Office");
        Component *pNodeHr = new Leaf("Beijing Human Resources Department");
        Component *pSubNodeSh = new Composite("Shanghai Branch");
        Component *pSubNodeCd = new Composite("Chengdu Branch");
        Component *pSubNodeBt = new Composite("Baotou Branch");
        pNode->Add(pNodeHr);
        pNode->Add(pSubNodeSh);
        pNode->Add(pSubNodeCd);
        pNode->Add(pSubNodeBt);
        pNode->Print();
        Component *pSubNodeShHr = new Leaf("Shanghai Human Resources Department");
        Component *pSubNodeShCg = new Leaf("Shanghai Purchasing Department");
        Component *pSubNodeShXs = new Leaf("Shanghai Sales department");
        Component *pSubNodeShZb = new Leaf("Shanghai Quality supervision Department");
        pSubNodeSh->Add(pSubNodeShHr);
        pSubNodeSh->Add(pSubNodeShCg);
        pSubNodeSh->Add(pSubNodeShXs);
        pSubNodeSh->Add(pSubNodeShZb);
        pNode->Print();

        // 公司不景气,需要关闭上海质量监督部门
        pSubNodeSh->Remove(pSubNodeShZb);
        if (pNode != NULL)
        {
            delete pNode;
            pNode = NULL;
        }
    }
}


客户端
#include "CompositePattern.h"


#include <iostream>
using namespace std;
using namespace CompositePattern;

void main()
{
    CompositePattern_Test();
}

运行结果
分享到:
评论

相关推荐

    设计模式之结构型模式

    在本文中,我们将深入探讨结构型设计模式,特别是桥接模式、适配器模式、装饰者模式和组合模式,以及它们在实际场景中的应用。 1. **桥接模式**: 桥接模式将抽象部分与实现部分分离,使得它们可以独立进行变化。...

    C#面向对象设计模式纵横谈(9):Composite 组合模式(结构型模式)

    标题中的“C#面向对象设计模式纵横谈(9):Composite组合模式(结构型模式)”明确了文章的主题聚焦于C#语言环境下的设计模式探讨,具体到第9篇讨论的是“Composite组合模式”。这一模式属于结构型模式的一种,旨在解决...

    23种设计模式,创建型模式共5种,结构型模式7种,行为型模式11种

    设计模式分为三大类:创建型模式、结构型模式和行为型模式。 **创建型模式**关注的是对象的创建。共有五种创建型模式: 1. **工厂方法模式**:它定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法...

    设计模式之结构型模式uml类图EA文件.rar

    在给定的压缩包文件中,我们关注的是结构型设计模式,这些模式主要用于处理类和对象的组合与结构,以实现更灵活、可扩展的设计。下面我们将详细探讨其中涉及到的几个模式:桥接模式、适配器模式、装饰者模式和组合...

    Java设计模式之结构型模式源码以及文档

    结构型模式可以分为七种:适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式和代理模式。这些模式在不同的场景下有着各自的用途,它们可以帮助我们构建出灵活、可扩展的系统。 适配器模式允许两个不...

    [结构型模式] 装饰者模式的理解

    装饰者模式是设计模式中的一种结构型模式,它在不改变原有对象的基础上,动态地给对象添加新的行为或属性,以此来扩展对象的功能。这种模式遵循开闭原则,即对扩展开放,对修改关闭,是一种非常实用的设计策略。 ...

    设计模式_结构型_组合模式.md

    组合模式是软件设计模式中的一种,属于结构型设计模式。其核心思想是将对象组合成树形结构以表示部分-整体的层次结构。组合模式使得客户端对单个对象和组合对象的使用具有一致性。 ### 组合模式定义 组合模式允许将...

    设计模式面面观(10):桥接模式(Bridge Pattern)-结构型模式

    组合模式(Composite Pattern)-结构型模式 (0%) &lt;br&gt;讲义书写模式 在实际的讲解中我会用一套模式来讲述我对设计模式的理解 1.给出当前章节模式的名称 2.讲述一个小故事,提出问题 3.回答这个...

    行为型模式+结构型模式+创建型模式:三大设计模式实例剖析与深入解读

    **结构型模式**则关注如何将类和对象组合成更大的结构。这些模式提供了一种方式来实现类或对象的组合,同时保持它们的接口一致。虽然描述中没有具体提及结构型模式的实例,但常见的结构型模式有代理模式、装饰器模式...

    结构型模式部分知识

    在软件设计领域,结构型模式是面向对象设计中的一种重要思想,它主要关注如何组织类和对象,以形成更复杂的结构,同时保持代码的清晰性和可维护性。本资料是关于高等软件工程中的7大结构型模式的PPT总结,包含了大量...

    Bridge 桥接模式(结构型模式)

    视频资源“7.Bridge 桥接模式(结构型模式).wmv”可能涵盖了以下内容: 1. 桥接模式的概念解释和基本结构。 2. 桥接模式的UML类图展示,解释各个角色之间的关系。 3. 实例演示,如图形界面库的设计,其中颜色和形状是...

    [结构型模式] 桥接模式的理解

    桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立进行变化。这种模式在软件设计中常用于降低复杂性,提高代码的可扩展性和可维护性。通过桥接模式,我们可以将一个大类的职责分解为两个...

    设计模式面面观(11):组合模式(Composite Pattern)-结构型模式

    组合模式是软件工程中的一种结构型设计模式,它允许我们以树形结构来表示部分与整体的关系,使得客户端代码可以一致地处理单个对象和对象组合。在组合模式中,部分和整体通过统一的接口进行交互,这种“部分”和...

    23种设计模式-结构型模式.docx

    《23种设计模式——结构型模式解析》 设计模式是软件工程中的一种最佳实践,它们是解决常见问题的经验总结,被广泛应用于软件设计中,以提高代码的可读性、可维护性和复用性。在众多的设计模式中,结构型模式尤其...

Global site tag (gtag.js) - Google Analytics