文档章节

设计模式-合成复用原则

hell03W
 hell03W
发布于 2016/11/13 15:09
字数 769
阅读 11
收藏 0

合成复用原则: 尽量使用对象组合, 而不是继承来达到复用的目的.

合成复用原则就是在一个新的对象里通过关联关系(包括组合关系和聚合关系)来使用一些已有的对象, 使之成为新对象的一部分; 新对象通过委派调用已有对象的方法达到复用的目的. 简言之: 复用时要尽量通过组合/聚合关系(关联关系), 少用继承.

在面向对象设计中, 可以通过两种方法在不同的环境中复用已有的设计和实现, 既*通过组合/聚合关系或者通过继承关系, 但首先应该考虑组合/聚合, *组合/聚合可以使系统更加灵活, 降低类与类之间的耦合度, 一个类的变化对其它类造成的影响较少; 其次才考虑继承关系, 在继承时, 要严格遵循里氏代换原则, 有效使用继承会有助于对问题的理解, 降低复杂度, 而滥用继承反而会增加系统构建和维护的难度以及系统的复杂度, 因此要慎重使用继承复合.

通过继承来进行复用的主要问题在于继承复用会破坏系统的封装性,因为继承会将基类的实现细节暴露给子类,由于基类的内部细节通常对子类来说是可见的,所以这种复用又称“白箱”复用,如果基类发生改变,那么子类的实现也不得不发生改变;从基类继承而来的实现是静态的,不可能在运行时发生改变,没有足够的灵活性;而且继承只能在有限的环境中使用(如类没有声明为不能被继承)。

由于组合或聚合关系可以将已有的对象(成员对象)纳入到新对象中, 使之成为新对象的一部分, 因此新对象可以调用已有对象的功能, 这杨作可以使得成员对象内部实现细节对于新对象不可见, 所以这种复用又称为"黑箱"复用, 相对继承关系来说, 耦合度降低, 成员对象的变化对新对象影响不大, 可以在新对象中根据实际需要有选择的调用成员对象的操作; 合成复合可以在运行时动态进行, 新对象可以动态的引用与成员对象类型相同的其他对象.

一般而言, 如果两个类之间是 "Has-A" 的关系应该使用组合/聚合; 如果是 "Is-A" 关系可以使用继承. "Is-A" 是严格的分类学意义上的一个定义, 意思是一个类是另一个类的"一种"; "Has-A" 表示某一个角色具有某一项职责.

详细示例请参考原文:

Reference: http://blog.csdn.net/lovelion/article/details/7563441

本文转载自:http://blog.csdn.net/lovelion/article/details/7563441

hell03W
粉丝 9
博文 145
码字总数 109892
作品 0
朝阳
程序员
私信 提问
Java 23种设计模式 初步了解

总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接...

engeue
01/02
0
0
设计模式初步学习笔记(单例模式)

关于设计模式,很久以前通过在网上看了一些资料关于讲设计模式的(推荐大话设计模式),虽说都似乎看懂了,但每次在需要用到相关设计模式的时候总是想不起来,主要对每种设计模式使用场景没研...

lxsh_wyan
04/29
0
0
PHP设计模式(一):简介及创建型模式

我们分三篇文章来总结一下设计模式在PHP中的应用,这是第一篇创建型模式。 一、设计模式简介 首先我们来认识一下什么是设计模式: 设计模式是一套被反复使用、容易被他人理解的、可靠的代码设...

juhenj
2014/05/15
228
2
咕泡-spring中常用设计模式概述

设计模式就是经验之谈,供后人借鉴,解决一些具有代表性的问题 设计模式来源于生活,反过来帮助我们更好生活 设计模式提升代码的可读性、可扩展性、维护成本、复杂业务问题 千万不要死记硬背...

职业搬砖20年
2018/08/17
0
0
Java设计模式系列一(前言)

说起设计模式,很多人都会觉得这个概念很熟悉,会想到单例模式、工厂模式等等,但是似乎又说不出来什么,说不上它的核心思想和设计原则。其实我们的项目中,为了代码复用,增加可维护性,很多...

Mooree
04/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Proxmox VE技巧 移除PVE “没有有效订阅” 的弹窗提示

登陆的时候提示没有有效的订阅You do not have a valid subscription for this server. Please visit www.proxmox.com to get a list of available options. 用的是免费版的,所以每次都提示......

以谁为师
13分钟前
0
0
Java设计模式之外观模式(门面模式)

什么是外观模式   外观模式(Facade),他隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口。这种类型的设计模式属于结构性模式。为子系统中的一组接口提供了一个统一的访问接口...

须臾之余
30分钟前
0
0
mysql免安装版,服务无法启动没有抱任何错误

1.解压 2.新建my.ini [mysqld]# Remove leading # and set to the amount of RAM for the most important data# cache in MySQL. Start at 70% of total RAM for dedicated server, e......

榴莲黑芝麻糊
51分钟前
0
0
Qt编写安防视频监控系统3-通道交换

一、前言 最开始写通道交换的功能的时候,走了很多弯路,比如最开始用最初级的办法,触发交换的时候,先关闭视频,然后设置新的url重新打开视频,这样处理非常低级而且耗内存还卡还很慢,毕竟...

飞扬青云
51分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部