您的位置:首页 > 其它

设计模式推演——组合与继承

2013-05-05 23:24 162 查看
OO中,复用代码可以有组合和继承两种方式,正如广大人民群众所论述的,尽可能使用组合。

这里我再不厌其烦的说明一下理由:

1. 组合比继承在框架结构上要简单,不会造成过深的继承层次。

2. 组合是黑盒重用,抽象层次更高。

其实上面这两条我觉得也没啥,重点还是下面三条:

3.组合可以在运行时动态选择复用的对象,而继承不行。直接上图,相信您看一眼就明白了

当Stack复用Sequence对象来实现自己的行为时,只要是序列型容器就可以了,具体可以是Vector,List。

最重要的是,具体选择Vector or List对象,可以在运行时由成员变量sequence的值决定,而变量的值是可以动态改变的






4. 使用继承方式,子类必须被迫接收所有父类公有方法,但是实际上,有些方法子类是不需要的,甚至这些方法会对子类有害。





显然,使用继承的方式实现Stack,虽然push 和 pop有了正确的行为,但是Vector的行为在Stack中仍然是可以合法调用的。你可能觉得这些多余的方法无关紧要,不去管他就可以了。但是别有用心的黑客呢,闲着蛋疼的某个屌丝呢?系统说不定就因此崩了

5. 当对象有多个行为或属性时,组合更容易复用。

(原谅我这里私自把鸭改成鸡,因为我觉得这样更能激发想象空间)



使用继承的方式实现, 叫的行为并不能被很好复用,“会叫不会飞的鸡”与“会叫又会飞的鸡” 在 叫的行为上是相同的,但是这里无法复用,只能在这两个子类中分别实现“会叫”这个行为。 如果客户又要求你增加一个会叫又会舞的鸡,你又得重复实现一遍“会叫”的行为。



使用组合的方式就完全是"名副其实"了, 这里复用,只是简单的搭积木。这里实际体现的是单一职责原则。

当然,组合的使用是有条件的,因为是黑箱复用,所以当有些行为无法通过对象的共有方法实现时,就只能依赖继承(可以有保护方法,典型的如模板方法)。

另外,对于理由5,如果飞的行为与鸡本身耦合很大,其实现必须依赖于鸡的私有或者保护成员,那么也是不可能应用组合的。

无论如何,只要有条件,我们应尽可能使用组合。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: