之前一直在查找组合对象之类的问题,下午正好有机会和大家讨论一下.
在面向对象的过程当中,经常使用的两个功能复用是类继承和组合(object composition)。
类继承允许你根据其他类的实现来定义一个类的实现。这种通过生成子类的复用通常被称为白箱复用(white-box reuse)。术语“白箱”是相对可视性而言的,在继承方式中,父类的外部细节对子类可见。
新的更复杂的功能可以通过组装或组合对象来取得。对象组合要求被组合的对象拥有精良定义的接口。这种复用风格被称为黑箱复用(black-box reuse),因为对象的外部细节是弗成见的。
类继承的优点和不足之处:
类继承是在编译时辰静态定义的,且可直接应用,程序设计语言直接支持类继承。类继承可以较方便地改变被复用的实现。当一个子类重定义父类的部份实现时,它也能影响它所继承的操作。
类继承不足之处在于继承在编译时辰就定义了,所以没法在运行时辰改变从父类继承的实现。继承对子类暴露了其父类的实现细节,所以继承常被认为“损坏了封装性”。子类与父类存在着很强的依赖关系,父类实现中的任何变更必然会致使子类发生变更。如果继承上去的实现不适合处理新的问题,则父类必须重写或被其他更适合的类替换。这种依赖关系限制了灵活性并终究限制了复用
性。一个可用的处理方法就是只继承抽象类,因为抽象类通常供给较少的实现。
对象组合是通过取得对其他对象的引用而在运行时辰动态定义的。组合要求对象遵守彼此的接口约定,进而要求更仔细地定义接口,而这些接口其实不妨碍你将一个对象和其他对象一起应用。对象只能通过接口拜访,只要类型一致,运行时辰还可以用一个对象来替换另一个对象;对象的实现是基于接口写的,所以实现上存在较少的依赖关系。
对象组合对系统设计优先应用对象组合有助于你保持每个类被封装,并被会合在单个任务上。这样类和类继承层次会保持较小范围,并且不太可能增长为弗成控制的庞然大物。另一方面,基于对象组合的设计会有更多的对象(而有较少的类),且系统的行为将依赖于对象间的关系而不是被定义在某个类中。这就是的面向对象设计的第二个原则:优先应用对象组合,而不是类继承。
理想情况下,你不应为取得复用而去创建新的构件。你应该可以只应用对象组合技巧,通过组装已有的构件就能取得你须要的功能。但是现实很少如此,因为可用构件的集合实际上其实不充足丰富。应用继承的复用使得创建新的构件要比组装旧的构件来得轻易。这样,继承和对象组合常一起应用。
然而,教训标明:设计者往往适度应用了继承这种复用技巧。但依赖于对象组合技巧的设计却有更好的复用性(或更简单)。你将会看到设计模式中一再应用对象组合技巧。
组合较继承的优势:
1、 组合允许将问题分割成互不依赖的子元件。每个元件可以由不同的开辟者开辟。
2、 组合比继承有更少的耦合,继承强制了继承类与被继承类之间的耦合,但是组合不会。
3、 组合会更少的代码冗余,继承比较轻易致使冗余。B继承A,在很多时候,B只会用到A部份,不须要的部份则成了冗余。组合完全 可以防止这些情况。
4、 组合有更好的封装,组合是基于公开接口的,每一个元件都不知道它外部的实现细节。而继承则会把父类外部实现
暴露给子类。
5、 组合更轻易变动,任何元件都可以被变动而保障对其它元件影响很小,只要保障公开的接口不变。
组合的不足:为了实现功能,会有很多的小模块
组合关系 |
继承关系 |
优点:不损坏封装,整体类与局部类之间松耦合,彼此相对独立 |
缺陷:损坏封装,子类与父类之间紧密耦合,子类依赖于父类的实现,子类缺少独立性 |
优点:拥有较好的可扩展性 |
缺陷:支持扩展,但是往往以增长系统结构的复杂度为价值 |
优点:支持动态组合。在运行时,整体对象可以选择不同类型的局部对象 |
缺陷:不支持动态继承。在运行时,子类没法选择不同的父类 |
优点:整体类可以对局部类停止包装,封装局部类的接口,供给新的接口 |
缺陷:子类不能改变父类的接口 |
缺陷:整体类不能自动取得和局部类同样的接口 |
优点:子类能自动继承父类的接口 |
缺陷:创建整体类的对象时,须要创建所有局部类的对象 |
优点:创建子类的对象时,不必创建父类的对象 |
近来在学设计模式,把好的重要的东西都慢慢总结起来,好好加油!!!
文章结束给大家分享下程序员的一些笑话语录:
IT业众生相
第一级:神人,天资过人而又是技术狂热者同时还拥有过人的商业头脑,高瞻远瞩,技术过人,大器也。如丁磊,求伯君。
第二级:高人,有天赋,技术过人但没有过人的商业头脑,通常此类人不是顶尖黑客就是技术总监之流。
第三级:牛人,技术精湛,熟悉行业知识,敢于创新,有自己的公司和软件产品。
第四级:工头,技术精湛,有领导团队的能力,此类人大公司项目经理居多。
第五级:技术工人,技术精湛,熟悉行业知识但领导能力欠加,此类人大多为系分人员或资深程序员,基本上桀骜不逊,自视清高,不愿于一般技术人员为伍,在论坛上基本以高手面目出现。
第六级:熟练工人,技术有广度无深度,喜欢钻研但浅尝辄止。此类人大多为老程序员,其中一部分喜欢利用工具去查找网上有漏洞的服务器,干点坏事以获取成绩感。如果心情好,在论坛上他们会回答菜鸟的大部分问题。此级别为软件业苦力的重要组成部分。
第七级:工人,某些技术较熟练但缺乏深度和广度,此类人大多为程序员级别,经常在论坛上提问偶尔也回答菜鸟的问题。为软件产业苦力的主要组成部分。
第八级:菜鸟,入门时间不长,在论坛上会反复提问很初级的问题,有一种唐僧的精神。虽然招人烦但基本很可爱。只要认真钻研,一两年后就能升级到上一层。
第九级:大忽悠,利用中国教育的弊病,顶着一顶高学历的帽子,在小公司里混个软件部经理,设计不行,代码不行,只会胡乱支配下属,拍领导马屁,在领导面前胡吹海侃,把自己打扮成技术高手的模样。把勾心斗角的办公室文化引入技术部门,实在龌龊!
第十级:驴或傻X,会写SELECT语句就说自己精通ORALCE,连寄存器有几种都不知道就说自己懂汇编,建议全部送到日本当IT产业工人,挣了日本人的钱还严重打击日本的软件业!
---------------------------------
原创文章 By
组合和对象
---------------------------------