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