• 组合关系与组合模式


    组合(Composite)

    对象A包含对象B,对象B离开对象A没有实际意义。是一种更强的关联关系。人包含手,手离开人的躯体就失去了它应有的作用。

    场景: Window窗体由滑动条slider、头部Header 和工作区Panel组合而成。

    组合模式

    将对象组合成树形结构以表示”部分-整体”的层次结构。 组合模式使得用户对单个对象和组合对象的使用具有一致性.

    YUI widget的相关设计中插件和扩展机制,都能实现这个组合的模型,具体运用起来, 可对比如下:

    1. 普通的mixin || 组合

    • mixin 是一种不需要用到严格的继承就可以复用代码的一种技术。如果多个类想用到某个类的某个方法,可以通过扩充这些类的原型已达到共享该方法。
    • YUI widget设计中大量采用了这种方式,如base-base、 attribute-base等模块,目的是提供一个统一的外部功能调用的入口
    • 模糊被组合对象的功能所属
    • Widget中的oop提供的build增加扩展的方式,本质上也是mixin
    function Slider() {}
    Slider.prototype.drag = function() { }
    
    function Header() { }
    Header.prototype.addTitle = function() { }
    
    function Panel() { }
    Panel.prototype.doSomething = function() {}
    
    function Window() {
        Slider.call(this, arguments);
        Header.call(this, arguments);
        Panel.call(this, arguments);
    }
    Y.mix(Window, Slider, false, null, 1);
    Y.mix(Window, Header, false, null, 1);
    Y.mix(Window, Panel, false, null, 1);

    2. plugin

    function Window(config) {
        this.plug(Header, config);
        this.plug(Slider, config);
        this.plug(Panel, config);
    }

    虽然插件也能勉强实现功能,不过类似这种场景不太适合用插件来实现

    • 由于插件的NS机制, 插件对象的功能不能直接作为Window对象的功能调用
    • 插件对象是基于实例, 也就是说每个window实例,都有三个相关的实例对象与其关联,浪费了资源
  • 相关阅读:
    SSL证书在HTTPS的应用
    tabindex和事件
    Git常用命令
    正则表达式的断言
    JS中的模块
    跨域问题
    MarkDown 入门
    Angular如何自定义webpack配置
    Angular常见错误
    Assembly 不能正常加载
  • 原文地址:https://www.cnblogs.com/mininice/p/3876303.html
Copyright © 2020-2023  润新知