你不知道的javascript设计模式(十) ---- 组合模式

本文详细介绍了JavaScript中的组合模式,通过宏命令的例子展示了其在树状结构中的应用。组合模式用于表示部分-整体的层次结构,允许用户统一处理单个对象和组合对象,简化了代码。适用场景包括业务逻辑表现为明显树状结构的情况。文章提醒,虽然组合模式能一视同仁处理对象,但过度使用会增加系统负担,需谨慎选择。
摘要由CSDN通过智能技术生成

前言

        同学们,上一章我们介绍了有关命令模式的知识,我们知道了命令模式拆分了命令和命令的执行,让发布者和执行者之间互不干涉,减少他们之间的耦合性,这一章我们将继续给大家一种新的设计模式,组合模式

正文

        宇宙中的很多东西都不仅仅是一个个体,人由很多器官构成,很多器官又由细胞构成,细胞中又包含各种各样的原子,原子又由原子核组成,这就是一种组合模式的体现,下面我们正式开始组合模式的学习

由宏命令看组合模式

        在上一章命令模式我们就介绍了宏命令,宏命令是一个包含了一组命令的对象,现在我们来稍微回顾一下昨天做咖啡的那个例子:

// 装入咖啡豆的命令
loadCoffeeBean = function() {
	console.log('装入咖啡豆’);
}
// 磨碎咖啡豆的命令
smashCoffeeBean = function() {
	console.log('磨碎咖啡豆');
}
// 加入热水
loadHotWater = function() {
	console.log('加入热水');
}
// 加入牛奶
loadMilk = function() {
	console.log('加入牛奶');
}
var macroCommand = function() {
	return {
		commandList: [],
		add: function(command) {
			this.commandList.push(command);
		},
		execute: function() {
			for(var i = 0; i < this.commandList.length; i++) {
				this.commandList[i]();
			}
		}
	}
}

        我们不难发现,这段宏命令呈现的是一个树状结构,这是一颗结构非常简单的树,其中macroCommand称为组合对象,装入咖啡豆这些命令是这段宏命令的叶子节点,其实这就是一个简单的组合模式的体现。

组合模式的用途

        组合模式将对象组合成树状结构,来表示“部分-整体”的一个结构。对于组合模式而言,我们利用它不仅可以达到构建一个树状结构的作用,还可以用它来表现对象的多态性,使得宏命令与单一命令一致,用户并不用在意这是宏命令还是单一的一个命令,就像用户只在意喝到咖啡,而并不在意做出咖啡中间包含了多少步,是一步做出来的还是很多步做出来的,这些都无关紧要
        这个例子相对还是比较简单,我们还不能通过它来领悟组合对象的优势,树状结构的叶子结构也许并不只有一层,也可能是一颗有很多层的复杂的树,这时候组合模式的作用就可以得到展现

组合模式的实现

        下面我们将就一具体的例子具体说明组合模式的实现,我们的电脑硬盘存取了数以万计的文件夹,每个文件夹中可能又有其他的文件和文件夹,不难理解,这其实是一个复杂且巨大的树状结构,用组合模式去实现这个场景有两大好处:

  • 当我们复制文件或者删除文件的时候不需要考虑文件类型,以及其中是否包括了文件,对它进行操作,自己就会按照树状结构的规则去往下遍历删除
  • 当我们遍历这个树状结构的时候,不需要考虑里面有多少文件,只需要从根节点文件开始遍历就行
var Folder = function(name) {
	this.name = name;
	this.files = [];
}

Folder.prototype.add = function(file) {
	this.files.push(file);
}

Folder.prototype.scan = function() {
	console.log('开始扫描文件夹:',  this.name);
	for(let i = 0; i < this.files.length; i++) {
		file.scan();
	}
}

var File = function(name) {
	this.name = name;
}

File.prototype.add = function() {
	throw new Errot('文件下不可存放文件');
}

File.prototype.scan = function() {
	console.log('开始扫描文件: ', name);
}

        这样一个简易的硬盘文件系统就利用组合模式设计好了

适用组合模式的场景

        组合模式如果运用妥当,可以大大简化代码,组合模式主要是适用于以下场景:

  • 业务逻辑可以表现为明显的树状结构,并且树叶节点有相同的特点不会有明显的特殊化差异
  • 希望统一处理业务中的对象,一视同仁的处理,在面对这棵树的时候,不需要考虑节点是否是叶子节点,可以一视同仁地处理

        滥用组合模式也会有明显的缺陷,将会导致系统中的对象看起来都差不多,不仅如此,组合模式还会创建过多的对象,导致系统的负担加重,所以在应用的时候需要仔细分析是否满足上面条件适合使用组合模式

小结

        这一章节我们介绍了组合模式,组合模式是一种基于树状结构的设计模式,弱化了每种对象之间的不同,将他们可以一视同仁的处理,使得用户不再需要去考虑操作对象的特殊性
       小伙伴们今天的学习就到这里了,如果觉得本文对你有帮助的话,欢迎转发,评论,收藏,点赞!!!
       每天学习进步一点点,就是领先的开始。如果想继续提高,欢迎关注我,或者关注公众号”祯民讲前端“。大量前端技术文章,面试资料,技巧等助你更进一步!
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值