组合or继承

到底使用组合还是继承是每本讲设计的资料里都要讨论一番的话题,两者的目标都是为了实现代码复用。下面说说我对组合和继承的优缺点的理解。

继承缺点:

1.破坏封装性

1)继承所有接口:不管是自己想要的接口还是不想要的接口,统统继承过来,导致对外提供的服务混乱,不利于程序管理

2)父类子类紧耦合:在一些极端的例子中,父类和子类紧耦合,子类依赖于父类的实现细节,如effective java 中add和addAll的自用性的例子。另外父类的些许改变很容易影响到子类

2.很难拓展功能,会造成继承结构膨胀

对于继承来说,设计父类的功能已经不容易,因为需要考虑到所有子类的通用功能,一旦加入新的子类就可能破坏父类的功能,由于子类的多样性,对功能的实现不统一,如无法将功能定义在父类,又想复用代码,只能增加继承结构,导致问题复杂化。

要想更好的复用代码,需要将程序的功能粒度做小,继承做到这点需要扩展继承结果,组合则需要更多的组合类型或组合实现,比较起来组合更简单易于维护。

3.java语言只支持单继承。

继承优点:

1.创建子类对象自动创建父类对象

2.自动继承父类接口

组合的优缺点和继承基本相反。

 

感悟:对象之间的关系和人人关系很类似,可以总结成两点。

1.人与人之间要保持适度的距离,无需过度热情(像继承父子耦合)亦要互相有所助益(像接口)

2.多靠朋友,少靠父母,多个朋友多条路(像组合多个对象)但保持自己的风格,靠父母只能单继承,兄弟姐妹间也不容易分享。

 

 

 

去年因为一个项目写了一点小程序,这个程序可以很好的诠释组合和继承的选择问题。

 

选择组合还是继承只要把握 is-a 和has -a的原则就解决了很多选择的烦恼。即新类需要向基类转化(多态)

 

 

1.

这个程序功能是需要完成一个发送、接收消息的模块,这个模块有两种接受模式,一种为socket模式,一种为auto模式。用继承实现的uml如下图所示:
组合or继承_第1张图片
 上面这个继承设计的问题

1..当有更多类继承ATPASessionHandler时,部分子类的部分方法行为一致,要想复用代码,只能增加继承结构,导致复杂性。当子类变多时,也很难定义父类的功能甚至改变父类的功能连锁子类的变动。

2.当有更多类继承ATPASessionHandler时,程序会很难扩展,比如需要加入新的功能,但并非所以子类都需要,这是这个功能放到父类还是子类呢?结果都不会理想。

 

组合中解决:分离可变行为与不变行为,建立一组新类代表行为,并在TPASessionHandler类中指定行为(即策略模式)

 

用组合实现的uml如下:
组合or继承_第2张图片
 

 利用组合的好处:

1.选择多样化,对于组合类可以选择多个组合接口完成组合类的功能。而不像继承只能单继承。

2.保证接口的独立性,不需要担心与被组合类之间的耦合。

3.扩展功能更容易保持独立性,不需要像继承那样增加继承层次或变动父类影响子类。

 

不错的相关文章

http://blog.csdn.net/hivon/article/details/583558

你可能感兴趣的:(java)