网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 
中国网管联盟
Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道
 当前位置: > bitsCN.com > JAVA > 新手入门 > oop面向对象 > 一些面向对象的设计法则(1)  

一些面向对象的设计法则(1)

2003-04-09  作者:BitsCN整理  来源:中国网管联盟  点评 投稿 收藏


  法则1:优先使用(对象)组合,而非(类)继承
  
  [ Favor Composition Over Inheritance ]
  
  
  
  
  
  
  
  
  组合
  
  
  
  
  
  
  1.(对象)组合是一种通过创建一个组合了其它对象的对象,从而获得新功能的复用方法。
  
  2.将功能委托给所组合的一个对象,从而获得新功能。
  
  3.有些时候也称之为"聚合"(aggregation)或"包容"(containment),尽管有些作者对这些术语赋予了专门的含义
  
  4.例如:
  
  a.聚合:一个对象拥有另一个对象或对另一个对象负责(即一个对象包含另一个对象或是另一个对象的一部分),并且聚合对象和其所有者具有相同的生命周期。(译者注:即所谓的"同生共死"关系,可参见GOF的Design
  Patterns: Elements of Reusable Object-Oriented Software的引言部分。)
  
  b.包容:一种特殊类型的组合,对于其它对象而言,容器中的被包含对象是不可见的,其它对象仅能通过容器对象来访问被包含对象。(Coad)
  
  
  
  
  
  
  
  
  5.包含可以通过以下两种方式实现:

网管联盟bitsCN@com


  
  a.根据引用(By reference)
  
  b.根据值(By value)
  
  6.C++允许根据值或引用来实现包含。
  
  7.但是在Java中,一切皆为对象的引用!
  
  
  
  
  
  
  
  
  
  组合的优点和缺点
  
  
  
  
  
  
  
  
  
  1.优点:
  
  a.容器类仅能通过被包含对象的接口来对其进行访问。
  
  b."黑盒"复用,因为被包含对象的内部细节对外是不可见。
  
  c.对装性好。
  
  d.实现上的相互依赖性比较小。(译者注:被包含对象与容器对象之间的依赖关系比较少)
  
  e.每一个类只专注于一项任务。
  
  f.通过获取指向其它的具有相同类型的对象引用,可以在运行期间动态地定义(对象的)组合。
  
  
  
  
  
  
  
  2.缺点:
  
  a.从而导致系统中的对象过多。
  
  b为了能将多个不同的对象作为组合块(composition block)来使用,必须仔细地对接口进行定义。
  
  
  
  
   中国网管论坛bbs.bitsCN.com
  
  
  
  
  继承
  
  
  
  
  
  
  1.(类)继承是一种通过扩展一个已有对象的实现,从而获得新功能的复用方法。
  
  2.泛化类(超类)可以显式地捕获那些公共的属性和方法。
  
  3.特殊类(子类)则通过附加属性和方法来进行实现的扩展。
  
  
  
  
  
  
  
  
  
  
  继承的优点和缺点
  
  
  
  
  
  
  1.优点:
  
  a.容易进行新的实现,因为其大多数可继承而来。
  
  b.易于修改或扩展那些被复用的实现。
  
  2.缺点:
  
  a.破坏了封装性,因为这会将父类的实现细节暴露给子类。
  
  b. "白盒"复用,因为父类的内部细节对于子类而言通常是可见的。
  
  c.当父类的实现更改时,子类也不得不会随之更改。
  
  d.从父类继承来的实现将不能在运行期间进行改变。
  
  
  
  
  
  
  
  
  
  
  Coad规则
  
  
  
  
  
  
  仅当下列的所有标准被满足时,方可使用继承:

网管论坛bbs_bitsCN_com


  
  a.子类表达了"是一个…的特殊类型",而非"是一个由…所扮演的角色"。
  
  b子类的一个实例永远不需要转化(transmute)为其它类的一个对象。
  
  c.子类是对其父类的职责(responsibility)进行扩展,而非重写或废除(nullify)。
  
  d.子类没有对那些仅作为一个工具类(utility class)的功能进行扩展。
  
  e.对于一个位于实际的问题域(Problem Domain)的类而言,其子类特指一种角色(role),交易(transaction)或设备(device)。
  
  
  
  继承/组合示例1
  
   
  
  1."是一个…的特殊类型",而非"是一个由…所扮演的角色"
  
  -->失败。乘客是人所扮演的一种角色。代理人亦然。
  
  2.永远不需要转化
  
  -->失败。随着时间的发展,一个Person的子类实例可能会从Passenger转变成Agent,再到Agent Passenger。
  
  3.扩展,而非重写和废除
  
  -->通过。
  
  4.不要扩展一个工具类
  
  -->通过。
  
  5.在问题域内,特指一种角色,交易或设备

网管u家u.bitscn@com


  
  -->失败。Person不是一种角色,交易或设备。
  
  
  
  
  
  
  
  
  
  继承并非适用于此处!
  
  
  
  使用组合进行挽救!
  
  
   
  
  继承/组合示例2
  
   
  
  1."是一个…的特殊类型",而非"是一个由…所扮演的角色"
  
  -->通过。乘客和代理人都是特殊类型的人所扮演的角色。
  
  2.永远不需要转化
  
  -->通过。一个Passenger对象将保持不变;Agent对象亦然。
  
  3.扩展,而非重写和废除
  
  -->通过。
  
  4.不要扩展一个工具类
  
  -->通过。
  
  5.在问题域内,特指一种角色,交易或设备
  
  -->通过。PersonRole是一种类型的角色。
  
  
  
  
  
  
  
  
  
  继承适用于此处!
  
  
  
  
  
  
  
  
  
  继承/组合示例3

网管u家u.bitscn@com


  
   
  
  1."是一个…的特殊类型",而非"是一个由…所扮演的角色"
  
  -->通过。预订和购买都是一种特殊类型的交易。
  
  2.永远不需要转化
  
  -->通过。一个Reservation对象将保持不变;Purchase对象亦然。
  
  3.扩展,而非重写和废除
  
  -->通过。
  
  4.不要扩展一个工具类
  
  -->通过。
  
  5.在问题域内,特指一种角色,交易或设备
  
  -->通过。是一种交易。
  
  
  
  
  
  
  
  
  
  继承适用于此处!
  
  
  
  
  
  
  
  
  
  继承/组合示例4
  
  
  
  1."是一个…的特殊类型",而非"是一个由…所扮演的角色"
  
  -->失败。预订不是一种特殊类型的observable。
  
  2.永远不需要转化
  
  -->通过。一个Reservation对象将保持不变。
  
  3.扩展,而非重写和废除
  
中国网管论坛bbs.bitsCN.com

  -->通过。
  
  4.不要扩展一个工具类
  
  -->失败。Observable就是一个工具类。
  
  5.在问题域内,特指一种角色,交易或设备
  
  -->不适用。Observable是一个工具类,并非一个问题域的类。。
  
  
  
  
  
  
  
  
  
  继承并非适用于此处!
  
  
  
  
  
  
  
  
  
  继承/组合总结
  
  
  
  
  
  
  1.组合与继承都是重要的重用方法
  
  2.在OO开发的早期,继承被过度地使用
  
  3.随着时间的发展,我们发现优先使用组合可以获得重用性与简单性更佳的设计
  
  4.当然可以通过继承,以扩充(enlarge)可用的组合类集(the set of composable classes)。
  
  5.因此组合与继承可以一起工作
  
  6.但是我们的基本法则是:
  
  优先使用对象组合,而非(类)继承
  
  [ Favor Composition Over Inheritance ]
  
  
  

TAGs法则   设计   对象   面向   一些   继承   组合   通过   角色    
 上一篇:一些面向对象的设计法则(2)   下一篇:JAVA入门教程:对象、类、包和接口
相关文章列表
一些面向对象的设计法则(1) 评论:
loading.. 评论加载中…
评论:请自觉遵守互联网相关政策法规,评论不得超过250字。

验证码: 注册用户
本类热门排行:
1.Java面向对象编程实例详解
2.用例子说明面向对象和面向过程的区别
3.JAVA程序员必读:基础篇(1.a)面向对象
4.过程式设计和面向对象设计的比较(组图)
5.JAVA入门教程:对象、类、包和接口
6.面向切面AOP与面向对象OOP
7.Java 入门之开始面向对象的编程
8.养成良好的Perl OOP习惯
9.JAVA程序员必读:基础篇(1.b)面向对象
10.面向对象编程:Java的简单数据类型
最新推荐文章:
1.Static和Final修饰类属性变量及初始化
2.讲述java中内部类的研究
3.Java对象的强、软、弱和虚引用
4.JAVA程序员必读:基础篇(1.a)面向对象
5.面向切面AOP与面向对象OOP
6.Java 学习之的对象初始化的讲究
7.养成良好的Perl OOP习惯
8.面向对象编程:Java复杂数据类型用法
9.VB.NET和Java的OOP设计
10.一些面向对象的设计法则(1)
网管论坛交流:
·不疯魔不成活
·令你大开眼界的真正标准化机房,已整理重
·为赈灾,女孩舍身拍“裸照”
·Windows Server 2003服务器群集创建和配
·exchange2k3全套官方资料
·双儿一周岁了。。。特殊的礼物来啦。。
·存储备份技术版块守则
·无盘技术交流区守则
·DOS命令基础大全之命令详解<作者吐血
·Windows XP 操作系统默认设置需要注意的