zoukankan      html  css  js  c++  java
  • [设计模式] javascript 之 组合模式

    组合模式说明

    组合模式用于简单化,一致化对单组件和复合组件的使用;其实它就是一棵树;

    这棵树有且只有一个根,访问入口,如果它不是一棵空树,那么由一个或几个树枝节点以及子叶节点组成,每个树枝节点还包含自己的子树枝以及子叶节点;

    在面向对象编程中,叶子以及复杂对象(树枝节点)都继承一个接口或抽象类分别实现;

    这个抽象定义一般三个部分组成,组件的基本信息,Add方法,Remove方法;

    叶子节点只包含本身的数据,Add, Remove 基本为空操作;

    树枝节点实现组件时,一般包含一个数组定义,用于存储子叶或树枝节点,还包括一个获取所有子节点的方法: 如GetList;

    实例场景:

    1>. 自然界中的各种树,树长在大地人,树头(树根),即是入口点,这棵树头向上生长,即有自己的叶子,又有自己的子树枝,某树枝还有自己的叶子,跟子树枝;

    2>. 操作系统目录结构、公司部门组织架构、国家省市县、宇宙万物都有单独元物质以及物物包含的现象,像这么看起来复杂的现象,都可以使用组合模式,即部分-整体模式来操作;

    一棵树:

     组合模式结构图:

    实例源码

    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 也差不多,就可以无需知道元素结构,进行查询,添加,删除的操作;

  • 相关阅读:
    【小梅哥SOPC学习笔记】Altera SOPC嵌入式系统设计教程
    modelsim使用常见问题及解决办法集锦③
    modelsim使用常见问题及解决办法集锦 ②
    KeepAlived双主模式高可用集群
    充分利用nginx的reload功能平滑的上架和更新业务
    nginx日志配置指令详解
    MongoDB 副本集
    MongoDB 备份还原
    MongoDB的搭建、参数
    mongoDB整个文件夹拷贝备份还原的坑
  • 原文地址:https://www.cnblogs.com/editor/p/4207232.html
Copyright © 2011-2022 走看看