首页 > 其他分享 >组合模式

组合模式

时间:2022-09-19 10:37:04浏览次数:81  
标签:std ComponentPtr 组合 模式 add vec 组件 include

组合模式的核心思想就是:一个组织有很多子组织,而无论子组织是单独一个部门或是一个分组织。该组织都希望把它们当成一样的子组织来管理。对于分组织,只用通知分组织就可以了,而不用一一通知分组织的各个部门。

  1. 组件(Component):为组合中的对象声明接口,声明了类共有接口的缺省行为(如这里的Add,Remove,GetChild函数),声明一个接口函数可以访问Component的子组件。
    1). Component::ComponentPtr:定义了各个组件共有的行为接口,由各个组件的具体实现.
    2). Component::add添加一个子组件
    3). Component::remove::删除一个子组件.
    4). Component::display:获得子组件的指针.

  2. 容器(Composite):是含有子组件的类,其内部包含了多种方法,主要是在当中实现了add与remove这类的操作用于对子组件进行控制。

  3. 叶节点(Leaf):是叶子结点,也就是不含有子组件的结点。

示例:

// CompositeModel.h文件
//#pragma once
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <memory>

class ComponentPtr
{
protected:
    std::string m_strName;
public:
    ComponentPtr(std::string str)
    {
        m_strName = str;
    }
    virtual void add(ComponentPtr * p) = 0;
    virtual void remove(ComponentPtr * p) = 0;
    virtual void display() = 0;
};

class LeafPtr : public ComponentPtr
{
public:
    LeafPtr(std::string str) : ComponentPtr(str) {}
    void add(ComponentPtr * p)
    {
        std::cout << "Leaf cannot add" << std::endl;
    }
    void remove(ComponentPtr * p)
    {
        std::cout << "Leaf cannot remove" << std::endl;
    }
    void display()
    {
        std::cout << m_strName << std::endl;
    }
};

class CompositePtr : public ComponentPtr
{
public:
    CompositePtr(std::string str) : ComponentPtr(str) {};
    ~CompositePtr()
    {
        if (!m_vec.empty())
        {
            m_vec.clear();
        }
    }
    void add(ComponentPtr * p)
    {
        auto it = find_if(m_vec.begin(), m_vec.end(),
            [p](std::shared_ptr<ComponentPtr> ptr) {return p == ptr.get(); });
        if (it == m_vec.end())
            m_vec.push_back(std::shared_ptr<ComponentPtr>(p));
    }
    void remove(ComponentPtr * p)
    {
        auto it = find_if(m_vec.begin(), m_vec.end(),
            [p](std::shared_ptr<ComponentPtr> ptr) {return p == ptr.get(); });
        if (it == m_vec.end())
            return;
        m_vec.erase(it);
    }
    void display()
    {
        for (auto it = m_vec.cbegin(); it != m_vec.cend(); it++)
        {
            (*it)->display();
        }
    }
private:
    // 这里使用智能指针不用自己释放new的内存
    std::vector<std::shared_ptr<ComponentPtr>> m_vec;
};


/**
#include <iostream>
#include "CompositeModel.h"
**/

int main()
{
    using namespace std;
    // 组合模式
    CompositePtr * p = new CompositePtr("总部");
    p->add(new LeafPtr("总部财务部门"));
    p->add(new LeafPtr("总部人力资源部门"));
    CompositePtr * p1 = new CompositePtr("上海分部");
    p1->add(new LeafPtr("上海分部财务部门"));
    p1->add(new LeafPtr("上海分部人力资源部门"));
    p->add(p1);
    p->display();

    getchar();
    return 0;
}

输出:

总部财务部门
总部人力资源部门
上海分部财务部门
上海分部人力资源部门




参考:

https://www.guyuehome.com/37300

标签:std,ComponentPtr,组合,模式,add,vec,组件,include
From: https://www.cnblogs.com/huvjie/p/16706833.html

相关文章

  • 享元模式
    享元模式享元接口packageflyweighttypeflyWeightinterface{setColor(string)getShape()string}享元角色packageflyweighttypeshapestruct{......
  • 设计模式之备忘录模式
    无论是我们在使用word还是记事本,系统都会为我们提供撤销的功能,这几乎是人人都会使用到的功能,而在我们实际开发中,会不会存在一个很复杂的对象,当更改了其中的某一个属性以后,......
  • cypress无头模式运行,生成测试报告
    1.内置测试报告 npxcypressrun--reporter=spec2.指定运行用例  npxcypressrun--reporter=spec--speccypress\integration\cypress-study\web\page\should_de......
  • 我的设计模式之旅、02 单例模式(第二次更新)
    编程旅途是漫长遥远的,在不同时刻有不同的感悟,本文会一直更新下去。思考总结什么是单例模式单例模式(SingletonPattern)属于创建型模式,它提供了一种创建对象的最佳方式。......
  • 我的设计模式之旅、12 原型模式
    编程旅途是漫长遥远的,在不同时刻有不同的感悟,本文会一直更新下去。思考总结思考问题如果没有原型模式,当我们复制复杂对象,在新建相同类的对象,遍历原始对象中的所有成员变......
  • 我的设计模式之旅、11 生成器(建造者)模式
    编程旅途是漫长遥远的,在不同时刻有不同的感悟,本文会一直更新下去。思考总结思考问题没有生成器模式的情况下在构建不同形式的复杂对象时的问题:如果为每种可能的对象都......
  • Problem P24. [算法课回溯]组合问题
    采用递归遍历所有可能性,再使用剪枝减小运行时间,利用回溯,代码有注释#include<iostream>#include<bits/stdc++.h>#include<cstdio>#include<string>usingnamespace......
  • 串的模式匹配算法
    一、算法设计思想1.简单模式匹配算法从主串的第一个位置开始和模式串的第一个字符开始比较,相等继续比较下一个字符;否则从主串的下一个字符和模式串的第一个字符重新开始......
  • 设计模式
    知识点脑图  一、策略模式https://blog.csdn.net/SK_study/article/details/122404194 ......
  • C检测大小端模式
    int1234567800001100001000100011100001001110大端char小端char#include<stdio.h>#include<stdlib.h>intmain(){ unionTestUnion { inta; char......