【OOAD】OOP的主要特征
聚合 “虚包含” 不明确
组合 “实包含” 明确
抽象(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