设计模式的实现手段无非就是两种,一种是组合,一种是继承。
而组合优于继承的地方是,因为在一个类里面组合进另一个类的对象,这两个类之间的耦合关系是松散耦合。这是设计模式的根本点所在,所有的复用性和灵活性、扩展性都是基于这一点。这是因为本类和组合进来的类都可以独立的自由的进化,本类可以扩展生成自己的子类等,而这些扩展的类都可以和组合进来的类合作,而组合进来的类也可以独立的扩展自己的子类实现,而这些子类实现都可以与本类进行无缝合作。这种多维度的自由变化会使软件具有很好的灵活性和可扩展性。比如本类新增一个实现,只要继承这个本类,这个新增加的类就可以和父类中组合进来的类进行合作,而根本不需要更改其他地方,同样,组合类增加一个实现,也无需更改本类及其子类的任何代码。
所以组合的方法很好的适应了开闭原则。新增功能或实现时,只需要新增类就行,不需要更改已有类。
同样,组合也能很好的设计出适合单一原则的系统。因为,对于组合进本类的同一功能的多种不同实现,只要组合进多种不同实现的父类(接口)就行,而这个父类的各种实现都可以独自的封装在一个类中,每个类只负责一种实现,而本类可以和这多种不同实现可以实现多种不同的组合关系,可以应对各种复杂多变的需求,而不需要把功能都写在一个类中。
这里有个例外,在抽象工厂里,如果新增一个产品,则需要更改代码,而新增工厂实现则不需要。
继承主要使用的情况是,当需要继承一个类的时候,最好是出于实现这个类中定义的方法的目的,而不是扩展被继承的类的功能。也就是说,继承时只能是实现抽象类中的抽象方法或借口,而不能出于扩展父类功能的目的。如果有扩展功能的需求,最好就是新增一个与需要继承的父类拥有共同父类的类,用以实现不同的实现。