组合模式说明编程
组合模式用于简单化,一致化对单组件和复合组件的使用;其实它就是一棵树;设计模式
这棵树有且只有一个根,访问入口,若是它不是一棵空树,那么由一个或几个树枝节点以及子叶节点组成,每一个树枝节点还包含本身的子树枝以及子叶节点;数组
在面向对象编程中,叶子以及复杂对象(树枝节点)都继承一个接口或抽象类分别实现;架构
这个抽象定义通常三个部分组成,组件的基本信息,Add方法,Remove方法;this
叶子节点只包含自己的数据,Add, Remove 基本为空操做;spa
树枝节点实现组件时,通常包含一个数组定义,用于存储子叶或树枝节点,还包括一个获取全部子节点的方法: 如GetList;操作系统
实例场景:prototype
1>. 天然界中的各类树,树长在大地人,树头(树根),便是入口点,这棵树头向上生长,即有本身的叶子,又有本身的子树枝,某树枝还有本身的叶子,跟子树枝;设计
2>. 操做系统目录结构、公司部门组织架构、国家省市县、宇宙万物都有单独元物质以及物物包含的现象,像这么看起来复杂的现象,均可以使用组合模式,即部分-总体模式来操做;3d
一棵树:
组合模式结构图:
实例源码
1. Component 组件;
function Component() { this.name = ''; } Component.prototype = { Add: function(comp) { //rewrite }, Remove: function(name) { //rewrite }, set: function(name) { this.name = name; }, operate: function() { //... } }
var comp = new Component();
2. Leaf 叶子节点;
function Leaf() { } Leaf.prototype = Object.create(comp, {}); Leaf.prototype.get = function() { return this.name; }
3. 树枝节点:
function Composite() { this.list = []; } Composite.prototype = Object.create(comp, {}); Composite.prototype = { Add: function(comp) { this.list.push(comp); }, Remove: function(name) { for (i in this.list) { var cmp = this.list[i]; if (cmp.name == name) { delete this.list[i]; break; } } }, operate: function() { //do... }, getList: function(name) { var cmp; for (i in this.list) { cmp = this.list[i]; if (cmp.name == name) { break; } } return cmp; } }
叶子节点基本能够直接使用 Component 的结构,或是直接以 Component 来建立,Composite 树枝节点,就必须重写 Add , Remove, operate 等方法;
使用方法:
var root = new Composite(); root.set("root"); //叶子 var leaf = new Leaf(); leaf.set('顶级叶子'); root.Add(leaf); //树枝节点; var child = new Composite(); child.set('child'); var childschild = new Composite(); childschild.set('cchild'); child.Add(childschild); root.Add(child); root.operate();
其余说明
组合模式,是一种结构型的设计模式,主要用于一致化处理简单元素和复杂元素操做,使得客户端使用能够与复合结构复杂的状况相解藕;客户端使用时,搜索递归到须要的节点或位置,均可以使用统一方法,无论是叶子节点或是树枝节点进行一致操做;在面向对象动态语言里,其实Javascript 也差很少,就能够无需知道元素结构,进行查询,添加,删除的操做;