组合关系与组合模式

组合(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实例,都有三个相关的实例对象与其关联,浪费了资源

 

posted @ 2013-10-10 19:12  mininice  阅读(270)  评论(0编辑  收藏  举报