敏捷软件开发 – COMPOSITE模式

   接口IShape有两个派生类:Circle和Square。第三个派生类是一个组合体。CompositeShape持有一个含有多个Shape实例的列表。当调用CompositeShape的drwa()方法时,它就把这个方法委托给列表中的每一个Shape实例。

  因此,对系统来说,一个CompositeShape实例就像是一个单一的Shape。可以把它传递给任何使用IShape的函数或者对象,并且它表现的就像是一个IShape。不过,实际上它指示一组Shape实例的代理。

组合命令

  下图展示了一个使用Command类的Sensor类。当Sensor检测到对它的刺激时,就调用Command的do()方法。

  如果这时新出现了一个Sensor必须执行多个Command的情况时。一般情况下,我们会认为这意味着每个Sensor类必须要维持一个Command对象的列表。然而,我们很快意识到每当Sensor需要执行多个Command时,它总是以一致的方法去对待这些Command对象。也就是说,它只是遍历列表并调用每个Command对象的do()方法。这种情况最适合使用COMPOSITE模式。

  这样,我们就不去改动Sensor类,而是创建一个如下图所示的CompositeCommand类。这意味着我们无需去更改Sensor以及Command。可以在不改变Sensor类和Command类的情况下向Sensor对象中增加多个Command对象。这里应用了OCP原则。

多重性还是非多重性

  使用COMPOSITE模式并不能把所有一对一关系都转变为一对多关系。只有那些以一致的方式对待列表中的每个对象的情况才具有转换的可能性。例如,如果你持有一个雇员对象列表,并在列表中搜寻发薪日在今天的雇员,你或许就不应该使用COMPOSITE模式,因为你不是以一致的方式去对待所有的雇员对象。

 

 

摘录自:[美]RobertC.Martin、MicahMartin著,邓辉、孙鸣译 敏捷软件开发原则、模式与实践(C#版修订版) [M]、人民邮电出版社,2013、346-350、

posted @ 2016-09-28 16:06  guqiangjs  阅读(249)  评论(0)    收藏  举报