您现在的位置是:主页 > news > 大网站cn域名/深圳seo博客

大网站cn域名/深圳seo博客

admin2025/6/20 21:13:35news

简介大网站cn域名,深圳seo博客,应用制作下载,有哪个网站是成都中科大旗做的回顾宏命令 在讲组合模式之前,我们先来回顾一下上一章节的命令模式。 刚才同事让我帮忙灌溉一下办公室里的花花草草,在这个例子中,command的发起者是同事,他希望我执行以下excute函数浇灌一下花花草草,恰巧办公室里有…

大网站cn域名,深圳seo博客,应用制作下载,有哪个网站是成都中科大旗做的回顾宏命令 在讲组合模式之前,我们先来回顾一下上一章节的命令模式。 刚才同事让我帮忙灌溉一下办公室里的花花草草,在这个例子中,command的发起者是同事,他希望我执行以下excute函数浇灌一下花花草草,恰巧办公室里有…

回顾宏命令

在讲组合模式之前,我们先来回顾一下上一章节的命令模式。
刚才同事让我帮忙灌溉一下办公室里的花花草草,在这个例子中,command的发起者是同事,他希望我执行以下excute函数浇灌一下花花草草,恰巧办公室里有好几盆盆栽,每一种植物的浇灌方式还不一样(第一次知道浇水还要看说明书)。于是产生了以下代码。

//同事
var commander = {// 接收参数植物种类pushCommand:function(plant){// 执行共识函数excuteplant.excute()}
}var aaa = {excute:function(){// 3-5天浇一次水,每次都浇透}
}var bbb = {excute:function(){// 每天浇一次,浇叶子上就行}
}// 此处省略好几种植物
commander.pushCommand(aaa)
commander.pushCommand(bbb)
// 此处省略好几种植物

相信已经有人察觉出来了,发出命令的人并不是让我去浇一下AAA,浇一下BBB,浇一下CCC…人家说的是,让我给植物浇一下水。因此这时候就需要一条命令涵盖上面这些ABC的操作,好在命令模式拥有一种共识excute执行函数,因此宏命令的生成就变得非常简单了。我们只需要一个对象能接收各种命令并能一次性把接受的命令执行完就行了。

//宏命令 利用函数提高复用性
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 macroCommand = MacroCommand();
macroCommand.add( aaa );
macroCommand.add( bbb );
macroCommand.add( 各种命令 );
macroCommand.execute(); 

费了老大劲讲解宏命令是因为宏命令本身就是一种组合模式。

组合模式的特性

  1. 组合模式符合树形结构的特征,即‘整体-部分-部分的部分-部分的部分的部分’,但是请注意组合模式是一种特殊的树形结构,从宏命令的例子中我们不难发现,在组合模式中,请求在树中的传递总是遵循一种逻辑,这可以让用户可以用一种共识方案(比如执行excute函数)非常方便的去遍历一棵树。
  2. 组合模式中的叶子节点可以作为基本对象被组合成更复杂的组合对象,组合对象又可以被继续组合,但组合树的复杂度永远不会影响最上层的调用方式。因此在复杂的操作,对于最上层调用者来说,就是一个excute的事情。

组合模式的特性中有个需要注意的点,组合对象可以用同一种请求方式请求,但叶子节点是负责具体的业务的,当我们给叶子节点添加叶子结点的时候往往会发现叶子节点上没有add方法,这时候我们需要在叶子节点上声明一个add function,并抛出一个异常告诉这是一个叶子节点,不是一个组合对象。因此树形结构严谨一点的描述应该是‘整体(组合对象)-部分(组合对象)-部分的部分(组合对象)-部分的部分的部分(叶子节点)’。

当我们讨论组合模式的时候,我们一直在讨论树形结构,这让很多人认为组合对象和叶子对象是一种父子关系,事实上我刚才已经解释了叶子节点不包含add方法,这就说明了叶子节点跟组合对象没有半毛钱关系,叶子节点是用来处理业务逻辑的,组合对象是将不同的业务逻辑放在一起提供一个适合调用的名字。那么叶子节点是不是完全没有共性呢?组合模式除了要求组合对象的请求拥有相同的接口之外,还有一个必要条件,就是对一组叶对象的操作也必须具有一致性。在文件夹系统中,就完美诠释了组合模式的特性,下面通过具体例子来加深组合模式的印象。

组合模式最贴切的使用场景——文件夹系统

结合组合模式的特性,可以说文件夹系统完美的诠释了组合模式。

  1. 文件夹系统有两种类型的文件,你只需要点击鼠标右键,系统就会问你,你是要建一个文件夹,还是一个文件?在文件夹系统中,文件夹即对应了组合对象,文件即对应了叶子节点。文件夹中可以有任意数量的文件夹和文件,把一些文件夹和文件组合起来之后,取个名字,就成为你想要的新文件夹了。你可以把前男(女)友的照片/视频/情书整合起来,放到一个文件夹里,你也可以以人名为单位,先整合到人名文件夹里,再放到一个大的前男(女)友文件夹里。
  2. 操作过电脑的都知道,文件夹(组合对象)的功能往往是一样的,但文件的操作方式就大同小异了,看视频你需要视频软件,看文档则要用word打开,但这些文件一定都包含复制粘贴剪切等操作,这些操作就是所谓的“叶对象操作一致性了”。如果没有这些一致的特性,那组合对象就失去了对这些文件的控制,你想要复制某个文件夹的时候,发现里面有个文件没有复制功能,那要么就是你的电脑坏了,要么就是这个文件有问题,总而言之,这个文件不适合呆在问价夹系统里。
  3. 虽然文件基本都存在文件夹里,但文件夹和文件并不是父子关系,你可以拖动任意文件到他原先的“父级”所在的层级,曾经的父子就变成兄弟了?所以不要认为组合对象和叶子节点有什么关系,叶子对象甚至可以跑到父级对象的父级层当爹作主。

关于文件系统代码这里就不放了(其实是我懒得写,感兴趣网上随便找),最重要的是理解什么是组合模式。代码只是辅助功能。感兴趣的可以自己模拟一个文件系统深化一下印象。