背景
本文标题为什么叫小菜学习设计模式,原因是本文内容主要是学习《大话设计模式》时的笔记摘要部分,当然,并不是记录书中小菜的学习过程,这个完全没有意义,而是指本人学习设计模式的成长之旅。
真诚的希望自己能够从一名小菜成长为一名大鸟!
编写的程序应该满足:
1)可维护
2)可扩展
3)可复用
4)够灵活
废话少说,言归正传,设计模式原则之:合成复用原则
书面理解
合成复用原则:要尽量使用合成/聚合,尽量不要使用继承。
对象的继承关系是在编译时就定义好了,所以无法在运行时改变从父类继承的实现。子类的实现与它的父类有非常紧密的依赖关系,以至于父类实现中的任何变化必然会导致子类发生变化。当你需要复用子类时,如果继承下来的实现不适合解决新的问题,则父类必须重写或被其他更适合的类替换。这种依赖关系限制了灵活性并最终限制了复用性。
优先使用对象的合成、聚合将有助于你保持每个类被封装,并被集中在单个任务上。这个类和类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物。
如果新对象的某些功能在别的已经创建好的对象里面已经实现,那么尽量使用别的对象提供的功能,使之成为新对象的一部分,而不要自己再重新创建。新对象通过向这些对象的委派达到复用已有功能的。
合成或组合(Composition)是一种强的拥有关系,体现了严格的部分和整体关系,部分和整体的生命周期是保持一致的。
聚合(Aggregation)是一种弱的拥有关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分。
个人的理解
合成的例子:大雁与大雁的翅膀,二者公存亡。比聚合的耦合关系更加强烈
聚合的例子:大雁与雁群,二者生命周期并不一致。
能够使用聚合不要使用合成;能够使用合成,不要使用继承。实际上这是类与类之间再进行解耦,一旦耦合性减弱,扩展性就会提高。合成复用原则的其实也提醒了我们一个功能不能重复,能够复用,就复用。因为我们知道数据库的三范式很大意义上就是为消除数据的冗余,一旦数据冗余就可能导致数据的不一致性,不一致性出现之后,数据的可信度就会减低,数据的维护也就会变得困难。所以,消除冗余是编程当中一个很重要的关节。还记重构里面有一句话:”代码的坏味道“,说的不正是冗余吗?
对于这个原则的最好例子就是:桥接模式的出现,将抽象部分与实现部分分离,使他们都可以独立的变化。实际上就是把一个接口实例作为另一个类的成员变量,这样,如果需要在类执行某种方法时,直接调用接口的方法,这样接口方法的具体实现对于类本身来说是透明的,所以做到了抽象与实现分离。不过个人绝对桥接模式最大的优点不是抽象与实现分离而是把继承改为了关联,耦合度降低了不少。