设计模式里有一个“合成/聚合复用原则(CARP)”,尽量使用合成/聚合(Has-A),尽量不要使用类继承(Is-A),即合成/聚合优于集成。
集成,我若要有你的功能,我必须是一个你。
合成/聚合,我可以承担你的职责,但我还是我。
看到这句话,突然想起古语论君子与小人,“君子和而不同,小人同而不和”。
和,责任与行为;同,外在表现与类族。
继承是一家独断;合成/聚合是百花齐放。
继承是祖国山河一片红,人人唱红歌;合成/聚合是个性张扬,但同有一个中国心。
继承,应对变化的方式是表象一致,人手一块红布(不管手里的红布与别人一样还是不一样!)。
合成/聚合,红心在我心,心映红布(相同的红布总是只有一块;但每个人中意的红布自己选)。
就为了达成某个相同目标而言,继承与“合成/聚合”的主要区别在于,
继承要求我必须是你,要有红心必须有红布。
合成/聚合只要求有红心,红布可共用别人的红布。
(类比比较,有点类似于C语言中的传值与传址——“完全拷贝一份”vs“只拷贝地址”)
你是需要人人都披红?还是需要人人有红心?
你喜欢君子?还是喜欢小人?