学以致用设计模式 之 “组合模式”

举报
看,未来 发表于 2020/12/30 00:02:38 2020/12/30
【摘要】 练完FTP那个项目之后感觉我整个人都变了,以前我比较倾向于故事和代码实现,现在发现我只想看:模式定义、适用场景、优劣势,这些东西以前我都是一笔带过的。。。 学设计模式,我觉得,知道干嘛用的,自然就能实现出来,要是代码写不出来那不应该来看设计模式,应该去看C++ Primer Plus哈哈哈。 文章目录 我们来作一棵文件管理树图:组合模式(安全模式)图:组...

在这里插入图片描述

练完FTP那个项目之后感觉我整个人都变了,以前我比较倾向于故事和代码实现,现在发现我只想看:模式定义、适用场景、优劣势,这些东西以前我都是一笔带过的。。。

学设计模式,我觉得,知道干嘛用的,自然就能实现出来,要是代码写不出来那不应该来看设计模式,应该去看C++ Primer Plus哈哈哈。

我们来作一棵文件管理树

首先呢,我之所以一直不碰组合模式,是因为它真的庞大,比中介者模式还要庞大,因为它和树挂钩了。

刚弄完FTP,那我们来看一下文件管理的东西:
首先,需要一个根目录,也就是树根;根目录下有各级子目录,也就是各级树枝;各级子目录下呢,又有自己的文件,这就是树叶了。

我们可以从根目录出发,找到任一级目录,也可以找到任一级目录下的任一个文件,这就是从树根开始,沿着路径找到指定树枝,再找到树叶。

那么,要怎么把这么庞大的一个文件管理系统变现呢?我采用的是偷懒的方式,用事务数据库来处理,进行的是数据的“虚假管理”,如果要用代码来管理,那就是“组合模式”的事情了。

你也可以想象成一棵树,树的节点为类节点,但是这棵树,要实现节点插入、节点删除、节点移动、节点查询、节点遍历查询等功能,但凡有点眼力见的人就该知道这些节点的类型需要保持一致性。这点和“备忘录模式”倒是很像,==备忘录是维护一条数组,组合是维护一棵树。==如果记不住就这样记。

云里雾里,云里雾里!来看类图:

图:组合模式(安全模式)

在这里插入图片描述

这是组合模式的安全模式,将实现全部放在了子类上。

当然,另一种模式不是“不安全模式”,是“透明模式”噢

图:组合模式(透明模式)

在这里插入图片描述

这里需要注意的是,设置子节点,绝不是设置一个子节点,也不是设置俩子节点,而是将子节点信息存在ArrayList中。也不要嫌麻烦,树就是这样的。

只可意会的部分代码

下面的代码,意会就好啦。

class Component{
	string info;
public:
	virtual string getInfo() = 0;
}

class Composite{
	list<Component*> Lcomp;
	Component* parent;
	int flag;
public:
	Composite(){
		Lcomp = new list<Component*>;
		flag = 0;
	}
	void setInfo(strint info){this->info = info;}
	string getInfo(){return this->info;}
	void addCorp(Component* comp){Lcomp->pushback(comp);}
	void removeCorp(Component* comp){Lcomp->remove(comp);}
	void setParent(Component* p){this->parent = Component;}
	Component* getParent(){
		if(parent) return parent;
		else return NULL;
	} Compontent* getChild(){
		return Lcomp[flag];
	}
	void getallChild(Compontent* root){	//比较麻烦的就是遍历整棵树了
		while((c = root->getChild())!=NULL){ if(c is leaf){ c->disomething(); } else{ getallChild(c); }
		}
	}
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

使用场景

场景很明确了,要用到树结构的地方,就可以考虑一下组合模式的思想:高层统一,层次分明。

文章来源: lion-wu.blog.csdn.net,作者:看,未来,版权归原作者所有,如需转载,请联系作者。

原文链接:lion-wu.blog.csdn.net/article/details/107071198

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。