Java笔记之组合大于继承

继承是一种多态工具,而不是一种代码复用工具。有些开发者喜欢用继承的方式来实现代码复用,即使是在没有多态关系的情况下。是否使用继承的规则是继承只能用在类之间有“父子”关系的情况下。

不要仅仅为了代码复用而继承。当你使用组合来实现代码复用的时候,是不会产生继承关系的。过度使用继承(通过“extends”关键字)的话,如果修改了父类,会损坏所有的子类。这是因为子类和父类的紧耦合关系是在编译期产生的。

不要仅仅为了多态而继承。如果你的类之间没有继承关系,并且你想要实现多态,那么你可以通过接口和组合的方式来实现,这样不仅可以实现代码重用,同时也可以实现运行时的灵活性。

这就是为什么四人帮(Gang of Four)的设计模式里更倾向于使用组合而不是继承的原因。面试者会在你的答案里着重关注这几个词语——“耦合”,“静态还是动态”,以及“发生在编译期还是运行时”。运行时的灵活性可以通过组合来实现,因为类可以在运行时动态地根据一个结果有条件或者无条件地进行组合。但是继承却是静态的。

组合和继承,都能实现对类的扩展。

区别如下表所示:

这里写图片描述

组合的具体实现方式是:不去扩展现有的类,而是在新的类中增加一个私有域,它引用现有类的一个实例。这样现有类就成了新类的一个组件,新类中的每个实例方法都可以调用被包含的现有类实例中对应的方法,并返回它的结果,这被称为转发,新类中的方法被称为转发方法。

因为新类的每个实例对现有类的实例进行了包装,所以也被称为包装类,这种设计模式叫装饰模式。包装类除了不适合用在回调框架(callback framework)中外,几乎没有缺点,由于没有暴露实现细节,得到的API就不会把你限制在原始的实现上,从而保证类的性能,避免客户端产生语义上的混淆。

猜你喜欢

转载自blog.csdn.net/johnwcheung/article/details/80042427
今日推荐