一种不方便的差异程序开发
时间:2012-6-10
任何组合模式的实现都需要处理一个困难的问题,我们在开始的时候说组合模式的目的是,使叶子对象和组合对象看上去几乎没有不同,我们这里说"几乎"是因为组合和叶子之间有一个必须正视的差异,组合对象必须管理它的子对象,这也就是说组合对象需要具备一个用来获得其子对象的方法,并且还需要移除子对象的方法,至于叶子类,它们当然没有需要管理的子对象,这是叶子类的本性.
具体如何来处理这种不同视我们的需求而定,一方面,我们可以将组合和叶子对象做的不同,例如,我们可以为组合对象提供add_child和remove_child方法(或对应的数组式样的去处符),并在叶子对象中忽略这些方法,这种方法背后的逻辑是,毕竟叶子对象是没有子对象的,所以它们不需要管理子对象的功能.
另一方面,组合模式的目的是要使叶子对象和组合对象之间没有明显区别,如果使用你的组合代码需要知道只有部分组件(即那些组合对象)具备get_child和add_child方法,而其他组件(即叶子对象)并没有这些方法,那么叶子和组合对象就具有明显区别子,但是话说回来,如果我们在叶子对象中加入子处理子对象的方法,那么如果外部调用子这些方法将会发生什么呢?要回复对remover_child的调用并不是太困难,叶子对象并没有子对象,所以没什么会被删除,但是如果有八调用子一个叶子对象的add_child方法的话怎么办呢/你是会忽略这个调用叫劲,还是会跳出一个异常.
正如我之前所说的,你如何来做这个决定取决于你的喜好,允许叶子对象和组合对象之间存在不同,或者硬将叶子对象无法处理的方法放在叶子对象没有子对象,我的本能选择是将这些方法留在叶子对象中,不过那么的话,我们将不得不承认叶子对象是无法处理子对象的.