欢迎来到天天文库
浏览记录
ID:51058039
大小:183.50 KB
页数:4页
时间:2020-03-08
《合成聚合复用原则.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、合成/聚合复用原则(Composite/AggregateReusePrinciple,CARP)合成(Composition)和聚合(Aggregation)都是关联(Association)的特殊种类。聚合表示整体和部分的关系,表示“拥有”。如奔驰S360汽车,对奔驰S360引擎、奔驰S360轮胎的关系是聚合关系,离开了奔驰S360汽车,引擎、轮胎就失去了存在的意义。在设计中,聚合不应该频繁出现,这样会增大设计的耦合度。合成则是一种更强的“拥有”,部分和整体的生命周期一样。合成的新的对象完全支配其组成部分,包括它们的创建和
2、湮灭等。一个合成关系的成分对象是不能与另一个合成关系共享的。 换句话说,合成是值的聚合(AggregationbyValue),而一般说的聚合是引用的聚合(AggregationbyReference)。在面向对象设计中,有两种基本的办法可以实现复用:第一种是通过合成/聚合,即合成复用原则,含义是指,尽量使用合成/聚合,而不是使用继承。第二种就是通过继承。要正确地选择合成/复用和继承的方法是,只有当以下的条件全部被满足时,才应当使用继承关系:1)子类是父类的一个特殊种类,而不是父类的一个角色,也就是区分"Has-A"和"I
3、s-A"。只有"Is-A"关系才符合继承关系,"Has-A"关系应当用聚合来描述。2)永远不会出现需要将子类换成另外一个类的子类的情况。如果不能肯定将来是否会变成另外一个子类的话,就不要使用继承。3)子类具有扩展父类的责任,而不是具有置换掉(override)或注销掉(Nullify)父类的责任。如果一个子类需要大量的置换掉父类的行为,那么这个类就不应该是这个父类的子类。4)只有在分类学角度上有意义时,才可以使用继承。如果语义上存在着明确的is-a关系,并且这种关系是稳定的、不变的,则考虑使用继承;如果没有is-a关系,或者这
4、种关系是可变的,使用合成。错误的使用继承而不是合成/聚合的一个常见原因是错误的把“Has-A”当成了“Is-A”。“Is-A”代表一个类是另外一个类的一种;“Has-A”代表一个类是另外一个类的一个角色,而不是另外一个类的特殊种类。我们看一个例子。如果我们把“人”当成一个类,然后把“雇员”,“经理”,“学生”当成是“人”的子类。这个的错误在于把“角色”的等级结构和“人”的等级结构混淆了。“经理”,“雇员”,“学生”是一个人的角色,一个人可以同时拥有上述角色。如果按继承来设计,那么如果一个人是雇员的话,就不可能是学生,这显然不合
5、理。正确的设计是有个抽象类“角色”,“人”可以拥有多个“角色”(聚合),“雇员”,“经理”,“学生”是“角色”的子类。另外一个就是只有两个类满足里氏替换原则的时候,才可能是“Is-A”关系。也就是说,如果两个类是“Has-A”关系,但是设计成了继承,那么肯定违反里氏替换原则。通过合成/聚合的优缺点优点:1)新对象存取子对象的唯一方法是通过子对象的接口。2)这种复用是黑箱复用,因为子对象的内部细节是新对象所看不见的。3)这种复用更好地支持封装性。4)这种复用实现上的相互依赖性比较小。5)每一个新的类可以将焦点集中在一个任务上。6
6、)这种复用可以在运行时间内动态进行,新对象可以动态的引用与子对象类型相同的对象。7)作为复用手段可以应用到几乎任何环境中去。缺点: 就是系统中会有较多的对象需要管理。4.4 通过继承来进行复用的优缺点优点:新的实现较为容易,因为父类的大部分功能可以通过继承的关系自动进入子类。修改和扩展继承而来的实现较为容易。 缺点:继承复用破坏封装性,因为继承将父类的实现细节暴露给子类。由于父类的内部细节常常是对于子类透明的,所以这种复用是透明的复用,又称“白箱”复用。如果父类发生改变,那么子类的实现也不得不发生改变。从父类继承而来的实
7、现是静态的,不可能在运行时间内发生改变,没有足够的灵活性。
此文档下载收益归作者所有