首页 > 其他分享 >带你深入浅出设计模式:十一、组合实体模式:软件世界的乐高积木

带你深入浅出设计模式:十一、组合实体模式:软件世界的乐高积木

时间:2024-10-10 14:47:46浏览次数:11  
标签:std const 乐高 add 文件夹 void 设计模式 软件世界 FileItem

此为设计模式十一谈!

总-分-总的结构生活化的例子给你讲解设计模式!

码农不易,各位学者学到东西请点赞收藏支持支持!

开始部分:

总:组合模式的目的:让客户端不再区分操作的是组合对象还是叶子对象,都以一个统一的方式来操作。

分:

1.老规矩,自行在vs创建一个控制台应用

2.实现编码,此处用文件夹例子来辅助理解

2.1 抽象组件对象,此处为文件条目,可以实现为文件和文件夹

2.2 叶子节点对象,此处为文件

2.3 组合节点对象,此处为文件夹

// 引入必要的头文件
#include <iostream>          // 用于输入输出
#include <string>            // 用于处理字符串
#include <vector>            // 用于创建动态数组

// 基础接口,所有文件和文件夹都应继承自这个接口
class FileItem {
public:
    virtual ~FileItem() {}  // 虚析构函数,确保派生类对象可以正确析构

    // 添加文件项
    virtual void add(FileItem*) = 0;  

    // 移除文件项
    virtual void remove(FileItem*) = 0;  

    // 打印文件或文件夹名称,带前缀
    virtual void print(std::string prefix) const = 0;  

    // 判断是否是文件夹
    virtual bool is_folder() const = 0;  

    // 获取名称
    virtual std::string get_name() const = 0;  
};

// 文件类 - 叶子节点
class File : public FileItem {
private:
    std::string name;  // 文件名

public:
    // 构造函数,初始化文件名
    File(const std::string& n): name(n) {}

    // 叶子节点不支持添加操作
    void add(FileItem*) override { /* 不做任何事情 */ }

    // 叶子节点不支持移除操作
    void remove(FileItem*) override { /* 不做任何事情 */ }

    // 打印文件名称,带前缀
    void print(const std::string& prefix) const override {
        std::cout << prefix << "-" << get_name() << std::endl;
    }

    // 文件不是文件夹
    bool is_folder() const override {
        return false;
    }

    // 获取文件名
    std::string get_name() const override {
        return name;
    }
};

// 文件夹类 - 组合节点
class Folder : public FileItem {
private:
    std::string name;  // 文件夹名
    std::vector<FileItem*> items;  // 文件夹里的元素

public:
    // 构造函数,初始化文件夹名
    Folder(const std::string& n): name(n) {}

    // 添加文件或文件夹
    void add(FileItem* item) override {
        items.push_back(item);
    }

    // 移除文件或文件夹
    void remove(FileItem* item) override {
        auto iter = std::find(items.begin(), items.end(), item);
        if(iter != items.end()) {
            delete *iter;  // 释放对象内存
            items.erase(iter);  // 从vector移除指针
        }
    }

    // 打印文件夹名称,然后递归打印所有子元素
    void print(const std::string& prefix) const override {
        std::cout << prefix << "+" << get_name() << std::endl;
        for(auto* item : items) {
            item->print(prefix + " ");  // 递归打印子元素
        }
    }

    // 文件夹是文件夹
    bool is_folder() const override {
        return true;
    }

    // 获取文件夹名
    std::string get_name() const override {
        return name;
    }
};

int main() {
    Folder home_folder("Home");  // 创建根目录

    File file1("report.txt");  // 创建文件
    File file2("summary.txt");  // 创建文件
    Folder documents("Documents");  // 创建文件夹
    documents.add(&file1);  // 将文件添加到文件夹
    documents.add(&file2);  // 将文件添加到文件夹
    home_folder.add(&documents);  // 将文件夹添加到根目录

    File file3("code.cpp");  // 创建文件
    Folder projects("Projects");  // 创建文件夹
    projects.add(&file3);  // 将文件添加到文件夹
    home_folder.add(&projects);  // 将文件夹添加到根目录

    home_folder.print("");  // 打印目录结构

    return 0;  // 程序结束
}

总:组合模式的优点:统一组合对象和叶子对象;简化客户端的调用;缺点:很难限制组合中的组件类型。

标签:std,const,乐高,add,文件夹,void,设计模式,软件世界,FileItem
From: https://blog.csdn.net/weixin_68122199/article/details/142820468

相关文章

  • 设计模式——观察者模式
    哈喽,各位盆友们!我是你们亲爱的学徒小z,今天给大家分享的文章是设计模式的——观察者模式。定义定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。通用类图1.具体结构Subject被观察者定义被观察者必须实现的职......
  • 设计模式——门面模式 | 外观模式
    哈喽,各位盆友们!我是你们亲爱的学徒小z,今天给大家分享的文章是设计模式的——门面模式。文章目录定义通用类图1.通用结构2.优点3.缺点使用场景注意事项1.一个子系统可以有多个门面2.门面不参与子系统内的业务逻辑定义定义:要求一个子系统的外部与其内部的通信必须......
  • HourlyEmployee 和SalariedEmployee 设计模式实现
    1.1IntroductionNote:Thisassignmentisabitdifferentfromtheprevioushomework,andasksyoutopracticewithJUnit5.Ensureyoureadtheinstructionscarefullyandsubmitwhatisrequired.Volunteerworkisadmirable,butmanypeopleenjoybeingpaid......
  • Python 享元模式:高效利用内存的设计模式
    在Python编程中,随着程序规模的增大和数据量的增加,内存管理变得至关重要。享元模式(FlyweightPattern)作为一种结构型设计模式,为我们提供了一种在某些场景下有效管理内存、提高系统性能的方法。本文将深入探讨Python中的享元模式,包括其概念、关键要点、实现方式、应用场景......
  • Python 外观模式:简化复杂系统交互的设计模式
    在软件开发过程中,随着系统规模的不断扩大和功能的日益复杂,子系统之间的交互可能变得错综复杂。Python中的外观模式(FacadePattern)提供了一种有效的解决方案,它能够简化这些复杂的交互,为客户端提供一个统一、易用的接口来访问系统。本文将深入探讨Python中的外观模式,详细阐......
  • Observable(观察者)设计模式
    前言Observable设计模式存在于许多JavaAPI和响应式编程中。下面介绍Java中永恒的Observable模式。Observable设计模式用于许多重要的JavaAPI。一个众所周知的示例是使用ActionListenerAPI执行操作的JButton。在这个例子中,我们ActionListener在按钮上进行了监听或观察。单击......
  • 设计模式-建造者模式
    什么是建造者模式?建造者模式是通过将多个简单对象通过一步步的组装构建出一个复杂对象的过程。简单模拟场景:装修公司的套餐服务,豪华、简约风格。比如对于吊顶和地板,有一级二级吊顶,一级二级地板等。按不同的套餐价格选取不同的组合。物料接口:publicinterfaceMatter{......
  • 模板设计模式
    模板设计模式是一种行为设计模式,它在一个方法中定义了一个算法的骨架,而将一些步骤的实现延迟到子类中。结构抽象类(AbstractClass)定义了模板方法(TemplateMethod),它包含了算法的骨架,通常是一个final方法,以防止子类重写整个算法流程。同时定义了一些抽象方法(AbstractMethod),这......
  • 数据设计模式一般很抽象
      Java的设计模式和其他语言的编程开发设计模式通用。设计模式分为架构模式和程序开发的设计模式。系统的架构模式分为CS架构和BS架构。单机版本的系统架构模式是继承与C/C++的开发项目软件。C/C++擅长技术的底层实现。驱动软件和操作系统也是应用程序。基于操作系统可以运......
  • 设计模式与非设计模式什么情况下使用
    一、特点    1、设计模式:        a、经验总结:                        设计模式是前人根据经验总结出来的,使用设计模式,就相当于是站在了前人的肩膀上。        b、可读性‌:              ......