JavaScript设计模式 - 组合模式

组合模式是一种设计模式,用于构建和操作部分-整体层次结构的对象。它允许客户端以一致的方式处理单个对象和组合对象,通过提供相同的接口。在组合模式中,请求从树的顶部向下传递,叶对象直接处理请求,而组合对象则遍历其子节点进行处理。此模式强调一致性,适用于需要统一操作树形结构的情况。
摘要由CSDN通过智能技术生成

1. 定义

组合模式就是用小的子对象来构建更大的对象,而这些小的子对象本身也许是由更小的“孙对象”构成的。

2. 用途

组合模式的好处

  • 将对象组合成树形结构,以表示“部分-整体”的层次结构
    • 组合模式提供了一种遍历树形结构的方案,通过调用组合对象的execute方法,程序会递归调用组合对象下面的叶对象的execute方法
  • 通过对象的多态性表现,使得用户对单个对象和组合对象的使用具有一致性
    • 利用对象的多态性表现,可以使客户端忽略组合对象和单个对象的不同。在组合模式中,客户将统一地使用组合结构中的所有对象,而不需要关心它究竟是组合对象还是单个对象

3. 请求在组合树中的传递过程

请求从树最顶端的对象往下传递,如果当前处理请求的对象是叶对象(普通子命令),叶对象自身会对请求做出相对应的处理,如果当前处理请求的对象是组合对象(宏命令),组合对象则会遍历他属下的子节点,将请求继续传递给这些子节点

4. 注意点

  • 组合模式不是父子关系
    • 组合模式是HAS-A(聚合)的关系,而不是IS-A,组合对象包含一组叶对象,但是leaf并不是composite的子类。组合对象把请求委托给他所包含的所有叶对象,他们能够合作的关键是拥有了相同的接口
  • 对叶对象操作的一致性
    • 组合模式除了要求组合和叶对象拥有相同的接口之外,还有一个必要条件,就是对一组叶对象的操作必须具有一致性
  • 双向映射关系
  • 用职责链模式提高组合模式性能
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 openAcCommand = { 
	 execute: function(){ 
	 	console.log( '打开空调' ); 
	 } 
 }; 
/**********家里的电视和音响是连接在一起的,所以可以用一个宏命令来组合打开电视和打开音响的命令
*********/ 
 var openTvCommand = { 
	 execute: function(){ 
	 	console.log( '打开电视' ); 
	 } 
 }; 
 var openSoundCommand = { 
	 execute: function(){ 
	 	console.log( '打开音响' ); 
	 } 
 }; 
 var macroCommand1 = MacroCommand(); 
 macroCommand1.add( openTvCommand ); 
 macroCommand1.add( openSoundCommand ); 
/*********关门、打开电脑和打登录 QQ 的命令****************/ 
 var closeDoorCommand = { 
	 execute: function(){ 
	 	console.log( '关门' ); 
	 } 
 }; 
 var openPcCommand = { 
 execute: function(){ 
 console.log( '开电脑' );
 } 
 }; 
 var openQQCommand = { 
	 execute: function(){ 
		 console.log( '登录 QQ' ); 
	}
 }; 
 var macroCommand2 = MacroCommand(); 
 macroCommand2.add( closeDoorCommand ); 
 macroCommand2.add( openPcCommand ); 
 macroCommand2.add( openQQCommand ); 
/*********现在把所有的命令组合成一个“超级命令”**********/ 
 var macroCommand = MacroCommand(); 
 macroCommand.add( openAcCommand ); 
 macroCommand.add( macroCommand1 ); 
 macroCommand.add( macroCommand2 ); 
/*********最后给遥控器绑定“超级命令”**********/ 
 var setCommand = (function( command ){ 
	 document.getElementById( 'button' ).onclick = function(){ 
	 command.execute(); 
	 } 
 })( macroCommand );

5. 适用场景

  1. 表示对象的部分-整体层次结构
  2. 客户希望统一对待树中的所有对象
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值