JavaScript设计模式之组合模式

组合模式

定义

  组合模式又叫整体-部分模式,它允许你将对象组合成树形结构来表现整体-部分层次结构,让使用者可以以一致的方式处理组合对象以及部分对象。

示例

在这里插入图片描述

var closeDoorCommand = {
	execute: function(){
		console.log("关门");
	}
};

var openPcCommand = {
	execute: function(){
		console.log("打开电脑");
	}
};

var openQQCommand = {
	execute: function(){
		console.log("登录QQ");
	}
};

var openAcCommand = {
	execute: function() {
		console.log("打开空调");
	}
}

var openTvCommand = {
	execute: function() {
		console.log("打开电视");
	}
}

var openSoundCommand = {
	execute: function() {
		console.log("打开音响");
	}
}


var MacroCommand = function(){
	return {
		commandsList: [],
		add: function(command){
			this.commandsList.push(command);
		},
		execute: function(){
			for(var i = 0, command; command = this.commandsList[i++];) {
				command.execute();
			}
		}
	}
};

var macroCommand1 = MacroCommand();
macroCommand1.add(openTvCommand);
macroCommand1.add(openSoundCommand);

var macroCommand2 = MacroCommand();
macroCommand2.add(closeDoorCommand);
macroCommand2.add(openPcCommand);
macroCommand2.add(openQQCommand);

var macroCommand = MacroCommand();
macroCommand.add(openAcCommand);
macroCommand.add(macroCommand1);
macroCommand.add(macroCommand2);

macroCommand.execute();

用途

  组合模式将对象组合成树形结构,以表示 “部分-整体” 的层次结构。除了用来表示树形结构之外,组合模式的另一个好处是通过对象的多态性表现,使得用户对单个对象和组合对象的使用具有一致性,下面分别说明:

  • 表示树形结构:此模式提供了一种遍历树形结构的方案,通过调用组合对象的 execute 方法,程序会递归调用组合对象下面的子对象的 execute 方法,所以我们的万能遥控器只需操作一次,便能一次完成关门、打开电脑、登录QQ这几件事。非常方便地描述对象部分-整体层次结构。
  • 利用对象多态性统一对待组合对象和单个对象。
    在这里插入图片描述

优缺点

组合模式的优点:

  • 由于组合对象和子对象具有同样的接口,因此调用的是组合对象还是子对象对使用者来说没有区别,使得使用者面向接口编程;
  • 如果想在组合模式的树中增加一个节点比较容易,在目标组合对象中添加即可,不会影响到其他对象,对扩展友好,符合开闭原则,利于维护;

组合模式的缺点:

  • 增加了系统复杂度,如果树中对象不多,则不一定需要使用;
  • 如果通过组合模式创建了太多的对象,那么这些对象可能会让系统负担不起;

适用场景

  • 如果对象组织呈树形结构就可以考虑使用组合模式,特别是如果操作树中对象的方法比较类似时;
  • 使用者希望统一对待树形结构中的对象,比如用户不想写一堆 if-else 来处理树中的节点时,可以使用组合模式;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值