组合/聚合复用原则

组合/聚合复用原则

什么是组合/聚合原则?

聚合:A类持有B类的“”引用,这里的弱引用指的是可以被垃圾回收器回收,它具有短暂的生命周期,也就是说对象A持有对象B的引用,但是对象B不持有对象A的引用,但是B类和A类没有任何类层次关系。例如雁群持有大雁的弱引用,雁群可以有多只大雁,所以雁群和大雁是聚合关系。

组合:A类持有B类的“”引用,也就是说A类由B类组合而成,B类是A类必不可少的一部分,并且B类不会被垃圾回收器回收,它们具有相同的生命周期。例如大雁持有翅膀的强引用,翅膀是大雁不可分割的一部分,所以翅膀和大雁是组合关系。

(注意:组合指的是B类可以使A类中的一个List集合,也可以是单个对象B)

组合/聚合复用优于继承

继承违背了开闭原则:继承打破了封装性,子类继承父类,那么父类的实现细节将完全暴露在子类当中,随着时间的推移,如果父类发生变化将会影响子类的也发生变化,所以在使用继承前,请确保子类是否完全是超类型的子类,即判断是否is-a,如果不是请不要使用继承。

无论是组合还是聚合,它们都持有对象的引用,在不继承类的前提下可以在内部调用引用的方法,这叫做转发,降低耦合度。

适当使用组合/聚合的好处就是明确每个对象的职责,滥用继承则是结构化的思想,这是要杜绝的!

设计模式中的体现

使用组合原则:

组合模式中的Composite(抽象节点)持有Component(容器节点)的集合引用;

观察者模式中的Isubject(抽象主题类)持有IObserver(抽象观察者)的集合引用;

使用聚合原则:

备忘录模式中的careTaker持有Memento的弱引用;

迭代器模式中的concreteIterator持有ConcreteAggretegate的弱引用;

建造者模式中的BuildDirector(指挥者)持有IBuilder(建造者抽象)的弱引用,具体建造者持有建造对象的弱引用;

外观模式中的Facade持有SubSystem(子系统)的弱引用;

装饰模式中的Decorator持有Component的弱引用;

策略模式中的Context持有Strategy的弱引用;

你可能感兴趣的:(设计模式,设计模式轻松学)