浅谈设计模式之七——Composite模式

同样地,先上uml图:

组合模式的意图:将对象组合合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。

uml解析:leaf是叶节点,Composite可以理解为是一个多个叶节点的组合,它是非叶节点,就相当于一个元件以及一个元件容器,里面有很多元件一样。这里可以用list或者vector实现。

本来是想用模板来实现,后来发现实在是多此一举,而且反而更不好了。

这里需要说的一点就是Leaf是叶节点,因此肯定没有添加、删除等功能,因为这些是没有意义的,这一点也是组合模式需要考虑的问题吧,这样会使得操作Leaf跟Composite会有少许的不同。

下面给出可执行代码:

Composition.h

#pragma once
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;

/*template<typename T>*/
class Component
{
public:
    Component(void);
    virtual ~Component(void);

public:
    virtual void Display() = 0;
    virtual void Add(Component &leaf){}
    virtual bool Remove(Component &leaf){return false;}
    virtual Component * GetChild(int Index)=0;
protected:
    std::string m_string;

};

class Composite:public Component
{
public:
    Composite(){}
    ~Composite(){}
    void Display();
    void Add(Component &leaf);
    bool Remove(Component &leaf);
    Component* GetChild(int Index);
private:
    vector<Component *> m_Com;
};

// template<typename T>
class Leaf:public Component
{
public:
    Leaf(std::string & str);
    Leaf(){}
    void Display();
//  bool Add(Leaf &leaf){}
//  bool Remove(){}
    Component* GetChild(int Index){ return NULL;}
private:
    std::string mstring;
};

Composition.cpp

#include "Component.h"

Component::Component()
{
}

Component::~Component()
{
}

void Composite::Add(Component &leaf)
{
    m_Com.push_back(&leaf);
}

/*template<typename T>*/
bool Composite::Remove(Component &leaf)
{

    vector<Component *>::iterator itor=find(m_Com.begin(),m_Com.end(),&leaf);
    if (itor == m_Com.end())
    {
        return false;
    }
    else
    {
        m_Com.erase(itor);
        return true;
    }
}

Component * Composite::GetChild(int Index)
{
    return m_Com[Index];
};

void Composite::Display()
{
    vector<Component*>::iterator itor = m_Com.begin();
    for (;itor!=m_Com.end();itor++)
    {
        (*itor)->Display();
    }
}

Leaf::Leaf(std::string &str):mstring(str)
{
}

// template<typename T>
void Leaf::Display()
{
    cout<<mstring<<endl;
}

main.cpp

#include "Component.h"

int main(int argc,char **argv)
{
    std::string str1="Leaf1";
    std::string str2="Leaf2";
    std::string str3="Leaf3";
    Leaf leaf1(str1);
    Leaf leaf2(str2);
    Leaf leaf3(str3);

    Component *f = new Composite;
    f->Add(leaf1);
    f->Add(leaf2);
    f->Add(leaf3);

    f->Display();

    f->Remove(leaf2);
    f->Display();

    return 0;
}

执行之后的结果:

一开始显示Leaf1、Leaf2、Leaf3,删除之后显示Leaf1、Leaf3。

这就是组合模式,祝读者生活快乐。

时间: 2024-12-22 04:23:06

浅谈设计模式之七——Composite模式的相关文章

浅谈设计模式1-策略模式

对于大多数面向对象的初学者来说,将思维模式从面向过程转变过来是一个比较困难的过程.很多人在用面向对象语言编写程序的时候,依然会感觉自己在用面向过程的思维,笔者分享这篇文章的用意便是希望可以对大家有一些积极的影响. 阅读本文可以是没有接触设计模式,但需要一定的面向对象基础,至少简单理解封装,继承多态. 对于刚开始接触设计模式来说,一开始就说概念性的东西,很少能够理解.所以我们可以先跳过这些,通过一个小的程序场景来进行一个比较直观的认识. 模拟魂斗罗发射子&弹 相信大家小的时候玩过一款叫魂斗罗的游戏

浅谈设计模式:原型模式(Prototype Pattern)

热爱生活.享受娱乐.专注技术,欢迎关注QGer,我们一起见证成长! 什么是原型模式? 官方解释: cloning of an existing object instead of creating new one and can also be customized as per the requirement.(克隆一个现有对象来代替新建一个对象,并且可以按定制要求克隆) 通俗解释:通过新建一个原型对象(该对象实现一个具有克隆接口的抽象类.接口)指明要创建的类型,调用对象自身的克隆接口创建出更

菜鸟之路-浅谈设计模式之工厂模式

工厂模式 工厂模式是我们最经常使用的实例化对象模式了,是用工厂方法取代new操作的一种模式. 著名的Jive论坛 ,就大量使用了工厂模式,工厂模式在Java程序系统能够说是随处可见. 由于工厂模式就相当于创建实例对象的new.我们经常要依据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,能否够考虑使用工厂模式,尽管这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的改动量. 工厂模式定义 我们以类Sample为例,

浅谈设计模式:迭代器模式(Iterator Pattern)

热爱生活.享受娱乐.专注技术,欢迎关注QGer,我们一起见证成长! 什么是迭代器模式? 官方解释:to access the elements of an aggregate object sequentially without exposing its underlying implementation. 顺序地访问集合对象的元素并且不暴露它的内部实现 通俗解释:假设给定一个集合对象,定义一个与之相关联的Iterator(迭代器),该迭代器能够访问集合对象的内部元素,通过迭代的方法能够按照顺

浅谈设计模式:解释器模式(Interpreter Pattern)

热爱生活.享受娱乐.专注技术,欢迎关注微信公众号QGer,我们一起见证成长! 什么是解释器模式? 官方解释:to define a representation of grammar of a given language, along with an interpreter that uses this representation to interpret sentences in the language. 定义一个给定语言的语法表达式,并用该表达式作为一个解释器来解释语言中的句子. 通俗

浅谈设计模式之八——Decorator模式

先上uml图: 意图:动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活. uml解析:装饰者模式又名包装器,顾名思义就是给某个对象添加一些功能,而不是给整个类添加一些功能.Component跟Decorator是聚合关系,子类ConcreteDecoratorA和ConcreteDecoratorB实现具体对Component的修饰. 下面给出可执行的示例代码: Decorator.h #pragma once #include <iostream>

浅谈设计模式:命令模式(Command Pattern)

热爱生活.享受娱乐.专注技术,欢迎关注微信公众号QGer,我们一起见证成长! 什么是命令模式? 官方解释:encapsulate a request under an object as a command and pass it to invoker object. Invoker object looks for the appropriate objectwhich can handle this command and pass the command to the correspond

浅谈设计模式3-模板方法模式

模版方法模式,个人认为还是用处比较多的一个设计模式,而且也是比较好学和理解的一个.依然来通过模拟一个场景来慢慢了解. 现在我们来实现一下泡茶这个过程.首先我们需要烧开一壶水,然后往茶壶中放茶叶,加入开水,等待茶泡好. 经过前两次的分享,大家应该具备了基本的面向对象的思想了,这里就不再用面向过程的方式演示了. 首先,有一种普通人,他泡茶的方式是这样的 public class Common     { public void MakeTea()         {             Heat

浅谈设计模式的学习(下)

时间过得真快啊,不知不觉又要周末了,借这个周末时间.把<浅谈设计模式的学习(下)>补上吧. 在<浅谈设计模式的学习(中)>中,说到了保持抽象的思维.接下来说一下第四点,做一个分享,也记录一下自己的学习历程. 4.学习设计模式,就不要把它看的太认真    设计模式是一个编程思想,它不是具体的代码套路.举个例子说明一下: 由于家传,接触到了一些中国的传统武术.当我与那些不懂传统武术的人交流的时候,他们总是认为中国的传统武术都是些套路.花架子,只是用来好看.在他们认为,两人打架,别人出拳