当前位置: 首页 > article >正文

组合模式——C++实现

1. 模式简介

组合模式是一种结构型模式

组合模式又叫做部分整体模式,组合模式用于把一组相似的对象当做一个单一的对象。特别擅长处理树形的数据,对于非树形的数据不好用它。

对于树形的数据,一个典型的例子就是文件系统。在文件系统里大致上可以分为文件夹文件两种类型的数据文件夹中可以包含文件也可以包含其他文件夹。就像下面这张图一样,文件的组织就像一颗多叉树。

如果使用组合模式来实现类似tree命令的文件名打印,UML类图如下:

比较简单,不详细说了,直接看下面的代码吧,兄弟们

2. 代码示例

#include <iostream>
#include <string>
#include <vector>

using namespace std;


class FileSystem
{
public:
	FileSystem(string name) : m_name(name) {}
	virtual ~FileSystem() {}
	virtual void show(int level = 0)=0;
	virtual bool addFile(FileSystem* file)=0;
protected:
	string m_name;
};

class File : public FileSystem
{
public:
	File(string name) : FileSystem(name) {}
	void show(int level = 0)
	{
		for (int i = 0; i < level; i++)
			cout << "    ";
		cout << "- " << m_name << endl;
	}
	bool addFile(FileSystem* file) { return false; }
};

class Directory : public FileSystem
{
public:
	Directory(string name) : FileSystem(name) {}
	void show(int level = 0)
	{
		for (int i = 0; i < level; i++)
			cout << "    ";
		cout << "+ " << m_name << endl;
		for (int i = 0; i < m_files.size(); i++)
			m_files[i]->show(level + 1);
	}
	bool addFile(FileSystem* file)
	{
		if (file == NULL)
			return false;
		m_files.push_back(file);
		return true;
	}
private:
	vector<FileSystem*> m_files;
};

int main()
{
	Directory* root = new Directory("root");
	Directory* dir1 = new Directory("dir1");
	Directory* dir2 = new Directory("dir2");
	File* file1 = new File("file1");
	File* file2 = new File("file2");
	File* file3 = new File("file3");
	root->addFile(dir1);
	root->addFile(dir2);
	dir1->addFile(file1);
	dir1->addFile(file2);
	dir2->addFile(file3);
	root->show();

	delete root;
	delete dir1;
	delete dir2;
	delete file1;
	delete file2;
	delete file3;

	return 0;
}

运行结果如下:

打印出了目录结构。

比较简单,使用场景也比较受限,出场机会不多。


http://www.kler.cn/a/465673.html

相关文章:

  • 基于Web的足球青训俱乐部管理后台系统的设计与开发源码(springboot+mysql+vue)
  • Outlook2024版如何回到经典Outlook
  • 【网络安全 | 漏洞挖掘】绕过电子邮件确认实现预账户接管
  • CSS——2.书写格式一
  • Spring系列一:spring的安装与使用
  • 简易Type-C拉取5V/3A电流电路分享
  • UniApp | 从入门到精通:开启全平台开发的大门
  • SpringSpringBoot常用注解总结
  • oceanbase集群访问异常问题处理
  • 高温大面积碳化硅外延生长装置及处理方法
  • 问题清除指南|关于num_classes与 BCELoss、BCEWithLogitsLoss 和 CrossEntropyLoss 的关系
  • 【论文阅读笔记】SCI算法与代码 | 低照度图像增强 | 2022.4.21
  • 后端java开发路由接口并部署服务器(四)
  • Leetcode打卡:我的日程安排表II
  • Chapter 3 Coding Attention Mechanisms
  • 【HarmonyOS应用开发——ArkTS语言】欢迎界面(启动加载页)的实现【合集】
  • 深入浅出:Java 抽象类与接口
  • PHP 5 6 7 8 9 各重要版本开发特性和选择简要说明
  • TT100K数据集, YOLO格式, COCO格式
  • fastadmin 表格数据导入
  • 打开游戏弹出缺少dll文件怎么解决?
  • AES加密的使用 Hutool 工具包SecureUtil.aes
  • MagicQuill: AI平板智能画师-AI智能交互式图像编辑系统
  • 二维码文件在线管理系统-收费版
  • C# OpenCV机器视觉:姿态估计
  • UE4_用户控件_3_用户控件输入数据的方法