zoukankan      html  css  js  c++  java
  • 组合模式

    今天做了组合模式的实验,花了差不多一个多小时的时间,成功运行了组合模式的代码,也知道了组合模式的原理,下面是组合模式的介绍以及实验要求及代码实现。

    简介:

    组合模式结构
    组合模式用于以相同的方式处理单个对象和对象的组合(或复合)。可以视为树形结构,都继承一个基类,能表示单个部分或整个对象层次。可以分解为几个部分:

    组件:在组合中所有对象的基础接口。其可以是接口或抽象类,包括管理子组合的通用方法。
    叶子节点:实现基础组件的缺省行为,不包括对其他对象的引用。
    组合节点:拥有叶子节点。实现基础组件的方法并定义子节点集合相关操作。
    客户端:通过基础组件接口访问组合元素。

    实验要求:

    用透明组合模式实现教材中的“文件夹浏览”这个例子。

    #include <iostream>
    #include <list>
    #include <memory>
    #include <utility>
    #include <cstddef>

    using namespace std;

    class File
    {
    public:
    File(string name) { m_name = name; }
    virtual ~File() {}
    virtual void Add(std::unique_ptr<File>) {}//这里默认实现为空函数,leaf节点中不用实现为空了
    virtual void Show(int depth) {} // 这里默认实现为空函数,leaf节点中不用实现为空了
    protected:
    string m_name;
    };

    //具体公司
    class ConcreteFile : public File
    {
    public:
    ConcreteFile(string name) : File(name) {}
    virtual ~ConcreteFile()
    {
    for (auto& File : m_listFile)
    {
    File.reset(nullptr);
    }
    }
    void Add(std::unique_ptr<File> pCom) { m_listFile.push_back(std::move(pCom)); } //位于树的中间,可以增加子树
    void Show(int depth)
    {
    for (int i = 0; i < depth; i++)
    cout << "-";
    cout << m_name << endl;
    auto iter = m_listFile.begin();
    for (; iter != m_listFile.end(); iter++) //显示下层结点
    (*iter)->Show(depth + 2);
    }
    private:
    list<std::unique_ptr<File>> m_listFile;
    };

    //具体的部门,财务部
    class FinanceDepartment : public File
    {
    public:
    FinanceDepartment(string name) :File(name) {}
    virtual ~FinanceDepartment() {}
    virtual void Show(int depth) //只需显示,无限添加函数,因为已是叶结点
    {
    for (int i = 0; i < depth; i++)
    cout << "-";
    cout << m_name << endl;
    }
    };

    //具体的部门,人力资源部
    class HRDepartment :public File
    {
    public:
    HRDepartment(string name) :File(name) {}
    virtual ~HRDepartment() {}
    virtual void Show(int depth) //只需显示,无限添加函数,因为已是叶结点
    {
    for (int i = 0; i < depth; i++)
    cout << "-";
    cout << m_name << endl;
    }
    };

    int main()
    {
    auto root = std::make_unique<ConcreteFile>("文件1");
    auto leaf1 = std::make_unique < FinanceDepartment>("文件21");
    auto leaf2 = std::make_unique < HRDepartment>("文件22");
    root->Add(std::move(leaf1));
    root->Add(std::move(leaf2));

    //分公司
    auto mid1 = std::make_unique < ConcreteFile>("文件31");
    auto leaf3 = std::make_unique < FinanceDepartment>("文件41");
    auto leaf4 = std::make_unique < HRDepartment>("文件42");
    mid1->Add(std::move(leaf3));
    mid1->Add(std::move(leaf4));
    root->Add(std::move(mid1));
    //分公司
    auto mid2 = std::make_unique < ConcreteFile>("文件32");
    auto leaf5 = std::make_unique < FinanceDepartment>("文件43");
    auto leaf6 = std::make_unique < HRDepartment>("文件44");
    mid2->Add(std::move(leaf5));
    mid2->Add(std::move(leaf6));
    root->Add(std::move(mid2));
    root->Show(0);


    return 0;
    }

  • 相关阅读:
    1386. 安排电影院座位
    1123. 最深叶节点的最近公共祖先
    375. 猜数字大小 II
    未能在system.drawing中找到bitmap
    856. 括号的分数
    140. 单词拆分 II
    5909. 并行课程 III
    typora + ImgHosting (一款不会存储图片的图床实现)
    IDEA插件:search with bing、search with baidu
    多吉搜索美化
  • 原文地址:https://www.cnblogs.com/092e/p/15543573.html
Copyright © 2011-2022 走看看