聚合 “虚包含” 不明确
组合 “实包含” 明确

抽象(abstract)
抽象:抽象是通过特定的实例抽取共同特征以后形成概念的过程。它强调主要特征,忽略次要特征。一个对象是现实世界中一个实体的抽象,一个类是一组对象的抽象,抽象是一种单一化的描述,它强调给出与应用相关的特性,抛弃不相关的特征。

忽略掉一个对象或实体的细节而只关注其主质特征的过程;
简化功能与格式;
帮助用户与对象交互。

封装(encapsulation)
封装(encapsulation) —隐藏内部实现
隐藏数据和实现;
提供公共方法供用户调用功能;
对象两种视图
外部视图:对象能做的工作
内部视图:对象如何完成工作
好处:
良好的封装能够减少耦合;
类内部的实现可以自由的修改;
类具有清晰的对外接口。(public)

封装(encapsulation)是对象的一个重要原则。它有两层含义:
第一,对象是其全部属性和全部服务紧密结合而形成的一个不可分割的整体;
第二,对象是一个不透明的黑盒子,表示对象状态的数据和实现操作的代码都被封装在黑盒子里面。使用一个对象的时候,只需知道它向外界提供的接口形式,无须知道它的数据结构细节和实现操作的算法。从外面看不见,也就更不可能从外面直接修改对象的私有属性了。
封装是将相关的概念组成一个单元,然后通过一个名称来引用它。面向对象封装是将数据和基于数据的操作封装成一个整体对象,对数据的访问或修改只能通过对象对外提供的接口进行。

继承、泛化、一般化关系(inheritance、Generalization)
继承(inheritance)—复用现有代码
通过存在的类型定义新类型的机制;
通常在两个类型之间存在“is a”或“kind of”这样的关系;
通过继承可实现代码重用,另外继承也是多态的基础;
如苹果 “is a ”水果。

不用继承的话,如果要修改功能,就必须在所有重复的方法中修改,代码越多,出错的可能性就越大,而继承的优点是,继承使得所有子类公共的部分都放在了父类,使得代码得到了共享,这就避免了重复,另外,继承可使得修改或扩展继承而来的实现都较为容易。

泛化(Generalization)—示例
泛化(Generalization)一般化指的是类之间的继承关系。
继承关系用空心三角形+实线来表示。

多态(polymorphism)
多态(polymorphism)-改写对象行为

一个名称,多种形式;
基于继承的多态;
调用方法时根据所给对象的不同选择不同的处理方式;
如Football-play():使用脚来完成
Basketball-play():使用手来完成
给出一个具体的足球或篮球,用户自动知道该使用谁的方式去执行play()

多态(polymorphism)-示例1
多态性是一种方法,这种方法使得在多个类中可以定义同一个操作或属性名,并在每个类中可以有不同的实现。多态性使得属性或变量在不同的时期可以表示不同类的对象。

如图所示,Rectangle和Circle都继承于Shape,对于Shape而言,会有getArea()的操作。但显而易见,Rectangle和Circle的getArea()方法的实现是完全不一样的,这就体现了多态的特征。

多态(polymorphism)-示例2


虚方法和方法重写
为了使子类的实例完全接替来自父类的类成员,父类必须将该成员声明为虚拟的。这是通过在该成员的返回类型之前添加virtual关键字来实现。
子类可以选择使用override关键字,将父类实现替换为它自己的实现,这就是方法重写Override,或者叫做方法覆写。
这个对象的声明必须是父类,而不是子类,实不同的对象可以执行相同的动作,但要通过它们自己的实现代码来执行。
例化的对象是子类,这才能实现多态。
多态的原理是当方法被调用时,无论对象是否被转换为其父类,都只有位于对象继承链最末端的方法实现会被调用。也就是说,虚方法是按照其运行时类型而非编译时类型进行动态绑定调用的。
没有学过设计模式,那么多对态、乃至对面向对象的理解多半都是肤浅和片面的。

关联(association)
对象之间交互时的一种引用方式;
当一个对象通过对另一个对象的引用去使用另一个对象的服务或操作时,两个对象之间便产生了关联;
如person使用computer,person与computer之间就存在了关联关系。

关联(association)—示例
当一个类‘知道’另一个类时,可以用关联(association)。
关联关系用实线箭头来表示。

聚合、聚集(aggregation)
关联关系的一种,一个对象成为另外一个对象的组成部分;
是一种关系较强的关联;
在两个对象之间存在“has a”这样的关系,一个对象作为另一个对象的属性存在,在外部对象被生产时,可由客户端指定与其关联的内部对象;
如汽车与轮胎,轮胎作为汽车的一个组成部分,它和汽车可以分别生产以后装配起来使用,但汽车可以换新轮胎,轮胎也可以卸下来给其他汽车使用。

聚合(aggregation)—示例
聚合表示一种弱的‘拥有’关系,体现是A对象可以包含B对象,但B对象不是A对象的一部分。
聚合关系用空心的菱形+实线箭头来表示。
聚集指的是整体与部分之间的关系,在实体域对象之间很常见

组合(composition)
当一个对象包含另一个对象时,外部对象负责管理内部对象的生命周期的情况;
关联关系中最为强烈的一种;
内部对象的创建由外部对象自己控制;
外部对象不存在时,内部对象也不能存在;
如电视机与显示器。

组合(composition)—示例
合成(Composition,也有翻译成‘组合’的)是一种强的‘拥有关系’,体现了严格的部分和整体的关系,部分和整体的生命周期一样。
合成关系用实心的菱形+实线箭头来表示。

依赖(Dependency)
依赖关系(Dependency),用虚线箭头来表示。

实现(Realization)
实现(Realization):一条带有空心箭头的虚线;

内聚与耦合(cohesion&coupling)
内聚:度量一个类独立完成某项工作的能力
耦合:度量系统内或系统之间依赖关系的复杂度
设计原则:增加内聚,减少耦合(高内聚,低耦合)

通过封装、继承、多态把程序的耦合度降低。
用设计模式使得程序更加的灵活,容易修改,并且易于复用。(可维护、可复用、可扩展、灵活性好)

【声明与感谢】
本文,站在许多巨人的肩膀上,借鉴和引用了许多他人拥有版权的作品或著述,在此,对前人们的贡献致谢。并同时公布引用的内容、原作者或来源(一些来源于互联网的内容本人无法追述本源,深表遗憾)。

【参考文献】
《设计模式—可复用面向对象软件的基础》作者: [美] Erich Gamma / Richard Helm / Ralph Johnson / John Vlissides 译者: 李英军 / 马晓星 / 蔡敏 / 刘建中 等 机械工业出版社
《重构—改善既有代码的设计》作者: Martin Fowler译者:候捷 中国电力出版社
《敏捷软件开发—原则、模式与实践》作者: Robert C. Martin 清华大学出版社
《程序员修炼之道—从小工到专家》作者: Andrew Hunt / David Thomas 电子工业出版社
《Head First 设计模式》作者: 弗里曼 译者: O'Reilly Taiwan公司 中国电力出版社
《设计模式之禅》 作者: 秦小波 机械工业出版社
MSDN WebCast 《C#面向对象设计模式纵横谈》 讲师:李建忠
刘伟. 设计模式. 北京:清华大学出版社, 2011.
刘伟. 设计模式实训教程. 北京:清华大学出版社, 2012.
《大话设计模式》 作者: 程杰 清华大学出版社
《C#图解教程》作者: 索利斯 译者: 苏林 / 朱晔 人民邮电出版社
《你必须知道的.NET》作者: 王涛
《项目中的.NET》作者: 李天平 电子工业出版社
《Microsoft .NET企业级应用架构设计》作者: (美)埃斯波西托等编著 译者: 陈黎夫
http://www.dofactory.com/Patterns/Patterns.aspx .NET Design Patterns
http://www.cnblogs.com/zhenyulu 博客作者:吕震宇
http://www.cnblogs.com/terrylee 博客作者:李会军
http://www.cnblogs.com/anlyren/ 博客作者:anlyren
http://www.cnblogs.com/idior 博客作者:idior
http://www.cnblogs.com/allenlooplee 博客作者:Allen lee
http://blog.csdn.net/ai92 博客作者:ai92
http://www.cnblogs.com/umlonline/ 博客作者:张传波
http://www.cnblogs.com/lovecherry/ 博客作者:LoveCherry

【OOAD】OOP的主要特征的更多相关文章

  1. 《OOAD与UML那点儿事》目录索引

    关键字:OOAD.UML.设计模式 各位园友,大家好,我是Bobby,在学习OOAD和开发的项目的过程中有一些感悟和想法,整理和编写了一些学习资料 [内容简介]掌握某种开发语言,让你实现了由零到一的脱 ...

  2. OOAD与UML笔记

         UML基础介绍 1.UML的定义 统一建模语言(UML)是一种图形化的语言,它可以帮助我们在OOAD过程中标识元素.构建模块.分析过程并可通过文档说明系统中的重要细节 2.OOAD OO ...

  3. OOAD基本概念

    学习目标: 1.理解与掌握面向对象的概念与方法. 2.使用UML. 3.完成面向对象的分析与设计工作. 4.了解OO的设计原则及一些典型的设计模式 什么是面向对象? 面向对象(Object-Orien ...

  4. 笔记一:OOAD与UML

    一.面向对象的概念与方法 1.  面向对象 1.1. 面向对象是一种系统建模技术 1.2. 面向对象编程是按照OO的方法学来开发程序的过程 1.3. 通过分析系统内对象的交互来描述或建模一个系统 1. ...

  5. OOAD与UML

    UML基础介绍 1.UML的定义 统一建模语言(UML)是一种图形化的语言,它可以帮助我们在OOAD过程中标识元素.构建模块.分析过程并可通过文档说明系统中的重要细节 2.OOAD OOAD是根据OO ...

  6. 图说OOP基础(一)

    本文用图形化的形式描述OOP的相关知识.对OOP进行系统化的梳理,以便掌握,仅供学习分享使用,如有不足之处,还请指正. 涉及知识点: OOP的相关知识 OOP知识总图 [Object-Orientat ...

  7. 【转载】图说OOP基础(一)

    本文用图形化的形式描述OOP的相关知识.对OOP进行系统化的梳理,以便掌握. 涉及知识点: OOP的相关知识 OOP知识[Object-Orientation Programming 面向对象编程]总 ...

  8. OOAD 面向对象的分析与设计

      OOAD  面向对象的分析与设计            OOA-----分析阶段(针对业务问题清晰视图, 列出系统完成任务,  整理业务的公共词汇,  列出解决业务的解决方法)         O ...

  9. 面向对象的OOA、OOD、OOP

    OOA Object-Oriented Analysis:面向对象分析方法 是在一个系统的开发过程中进行了系统业务调查以后,按照面向对象的思想来分析问题.OOA与结构化分析有较大的区别.OOA所强调的 ...

随机推荐

  1. js中的text(),html() ,val()的区别

    js中的text(),html() ,val()的区别 text(),html() ,val()三个方法用于html元素的存值和取值,但是他们各有特点,text()用于html元素文本内容的存取,ht ...

  2. JDK API从下载到使用

    经常有人问我一些java常用类的使用方法,还有一些问某个常用类是干啥的.这些问题都是不会查询jdk api,对常用类的方法不熟悉等情况.于是,经过再三思考决定编写jdk api查询使用手册. ☆准备工 ...

  3. the major advances since the birth of the computer

    COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION • The family concept: ...

  4. Java-马士兵设计模式学习笔记-代理模式-聚合与继承方式比较

    一.概述 1.目标:要在Tank的move()方法做时间代理及日志代理(可以设想以后还要增加很多代理处理),且代理间的顺序可活更换 2.思路: (1)聚合:代理类聚合了被代理类,且代理类及被代理类都实 ...

  5. Bootstrap 弹出框和警告框插件

    一.弹出框 弹出框即点击一个元素弹出一个包含标题和内容的容器. //基本用法 <button class="btn btn-lg btn-danger" type=" ...

  6. 相识从C语言开始

    大家好,我是你们这学期C语言的助教吴科桥(女O(∩_∩)O),非常开心能在你们美好的大学这站与你们相遇,希望可以为你们学习C语言略尽绵薄之力. 开学第一周: 1. 希望每个同学都可以有自己的博客,我会 ...

  7. 微信蓝牙BLE接入调试指引 硬件篇

    1 平台框架简介 微信蓝牙BLE由三个模块组成,分别是蓝牙设备.微信和第三方服务器,如下图: 蓝牙设备与微信之间的通信是通过蓝牙GATT协议进行. 微信与第三方服器之间的通信是通过网络http 接口进 ...

  8. *BigDecimal初识

    Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算.双精度浮点型变量double可以处 理16位有效数.在实际应用中,需要对更大或者更小的数进 ...

  9. 使用Xcode6和IOS8SDK以后遇到的问题

    定位.苹果在IOS8里面修改了定位授权协议,也就意味着你原来的app在ios8上很可能无法定位.目前最好的办法就是在app启动的时候调用IOS8的定位授权API来获取用户的授权,这样就不要在其他地方做 ...

  10. @Override的作用

    @Override是伪代码,表示重写(不写也可以,但是有些IDE会报warning),不过写上有如下好处: 1.可以当注释用,方便阅读:2.编译器可以给你验证@Override下面的方法名是否是你父类 ...