`
haierboos
  • 浏览: 438201 次
文章分类
社区版块
存档分类
最新评论

面向对象三大基本特性,五大基本原则

 
阅读更多
透切理解面向对象三大基本特性是理解面向对象五大基本原则的基础.


三大基本特性是:封装,继承,多态

所谓封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。封装是面向对象的特征之一,是对象和类概念的主要特性。 简单的说,一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。


所谓继承是指可以让某个类型的对象获得另一个类型的对象的属性的方法。它支持按级分类的概念。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。 通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。继承的过程,就是从一般到特殊的过程。要实现继承,可以通过“继承”(Inheritance)和“组合”(Composition)来实现。继承概念的实现方式有二类:实现继承与接口继承。实现继承是指直接使用基类的属性和方法而无需额外编码的能力;接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力;

所谓多态就是指一个类实例的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。


五大基本原则


单一职责原则SRP(SingleResponsibilityPrinciple)
是指一个类的功能要单一,不能包罗万象。如同一个人一样,分配的工作不能太多,否则一天到晚虽然忙忙碌碌的,但效率却高不起来。

一个类应该仅有一个引起它变化的原因(最简单,最容易理解却最不容易做到的一个设计原则)
职员类例子:
<wbr><wbr>比如在职员类里,将工程师、销售人员、销售经理这些情况都放在职员类里考虑,其结果将会非常混乱,在这个假设下,职员类里的每个方法都要if else判断是哪种情况,从类结构上来说将会十分臃肿,并且上述三种的职员类型,不论哪一种发生需求变化,都会改变职员类!这个是大家所不愿意看到的!<br><br><br><span style="color:#3333ff">开放封闭原则OCP(Open-ClosePrinciple)<br></span>一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。比如:一个网络模块,原来只服务端功能,而现在要加入客户端功能,<br> 那么应当在不用修改服务端功能代码的前提下,就能够增加客户端功能的实现代码,这要求在设计之初,就应当将服务端和客户端分开,公共部分抽象出来。<br> 既开放又封闭,对扩展是开放的,对更改是封闭的!</wbr></wbr>

扩展即扩展现行的模块,当我们软件的实际应用发生改变时,出现新的需求,就需要我们对模块进行扩展,使其能够满足新的需求!
更改封闭即是在我们对模块进行扩展时,勿需对源有程序代码和DLL进行修改或重新编译文件!
这个原则对我们在设计类的时候很有帮助,坚持这个原则就必须尽量考虑接口封装,抽象机制和多态技术!


替换原则(theLiskovSubstitutionPrincipleLSP)
子类应当可以替换父类并出现在父类能够出现的任何地方。比如:公司搞年度晚会,所有员工可以参加抽奖,那么不管是老员工还是新员工,
也不管是总部员工还是外派员工,都应当可以参加抽奖,否则这公司就不和谐了。

子类可以替换父类并且出现在父类能够出现的任何地方

这个原则也是在贯彻GOF倡导的面向接口编程!
在这个原则中父类应尽可能使用接口或者抽象类来实现!
子类通过实现了父类接口,能够替父类的使用地方!
通过这个原则,我们客户端在使用父类接口的时候,通过子类实现!
意思就是说我们依赖父类接口,在客户端声明一个父类接口,通过其子类来实现
这个时候就要求子类必须能够替换父类所出现的任何地方,这样做的好处就是,在根据新要求扩展父类接口的新子类的时候而不影响当前客户端的使用!



依赖倒置原则(theDependencyInversionPrincipleDIP)

具体依赖抽象,上层依赖下层。假设B是较A低的模块,但B需要使用到A的功能,
这个时候,B不应当直接使用A中的具体类: 而应当由B定义一抽象接口,并由A来实现这个抽象接口,B只使用这个抽象接口:这样就达到
了依赖倒置的目的,B也解除了对A的依赖,反过来是A依赖于B定义的抽象接口。通过上层模块难以避免依赖下层模块,假如B也直接依赖A的实现,那么就可能造成循环依赖。一个常见的问题就是编译A模块时需要直接包含到B模块的cpp文件,而编译B时同样要直接包含到A的cpp文件。
传统的结构化编程中,最上层的模块通常都要依赖下面的子模块来实现,也称为高层依赖低层!
所以DIP原则就是要逆转这种依赖关系,让高层模块不要依赖低层模块,所以称之为依赖倒置原则!

接口分离原则(theInterfaceSegregationPrincipleISP)
模块间要通过抽象接口隔离开,而不是通过具体的类强耦合起来

这个原则的意思是:使用多个专门的接口比使用单个接口要好的多!
这个我有体会,在我实际编程中,为了减少接口的定义,将许多类似的方法都放在一个接口中,最后发现,维护和实现接口的时候花了太多精力,而接口所定义的操作相当于对客户端的一种承诺,这种承诺当然是越少越好,越精练越好,过多的承诺带来的就是你的大量精力和时间去维护!

quote from:http://www.baidu.com/baidu?ie=utf-8&tn=myie2dg&ch=15&word=%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E7%9A%84%E4%BA%94%E5%A4%A7%E5%9F%BA%E6%9C%AC%E5%8E%9F%E5%88%99

分享到:
评论

相关推荐

    面向对象的三大特性五项原则

    面向对象的三大特性五项原则

    深入PHP面向对象、模式与实践 (第2版)

    为何使用它们第8章 模式原则第9章 生成对象第10章 让面向对象编程更加灵活的模式第11章 执行及描述任务第12章 企业模式第13章 数据库模式第四部分 实践第14章 良好和糟糕的实践第 15章 PEAR 第16章 用phpDocumentor...

    C++ 面向对象教程 21 courses#

    1.1.1 对象:特性+行为 1 1.1.2 继承:类型关系 1 1.1.3 多态性 2 1.1.4 操作概念:OOP程序像什么 3 1.2 为什么C++会成功 3 1.2.1 较好的C 3 1.2.2 采用渐进的学习方式 4 1.2.3 运行效率 4 1.2.4 系统更容易表达和...

    面试题:Java基础知识

    面向对象的五大基本原则是什么?什么是JVM、JDK、JRE为什么Java是跨平台的Java怎么实现平台无关JVM还支持哪些语言值传递、引用传递的区别访问修饰符public、private、protected,以及不写(默认)时的区别?抽象类与...

    php面向对象全攻略 (五) 封装性

    9.封装性 封装性是面向对象编程中的三大特性之一,封装性就是把对象的属性和服务结合成一个 独立的相同单位,并尽可能隐蔽对象的内部细节,包含两个含义:1.把对象的全部属性和全 部服务结合在一起,形成一个不可...

    软件工程-理论与实践(许家珆)习题答案

    面向对象的分析方法主要是建立三类模型,即(D)。 A) 系统模型、ER模型、应用模型 B) 对象模型、动态模型、应用模型 C) E-R模型、对象模型、功能模型 D) 对象模型、动态模型、功能模型 4. SA法的主要描述...

    软件工程—实践者的研究方法

    ·什么是应用于面向对象软件的测试的基本概念和原则? ·当考虑面向对象软件时,测试策略和测试用例的设计方法将如何改变? ·什么技术度量可用于评估面向对象软件的质量? 一旦这些问题得到回答,你将了解如何使用...

    Python第一阶段笔记汇总.docx

    三 三大特征 78 (总结)三大特征 78 (一)封装(按需求分,按行为分) 78 (二)继承(抽象 -&gt; 统一 -&gt; 隔离) 86 (三) 多态 90 四 设计原则 95 (总结)设计原则 95 (一)开-闭原则(目标、总的指导思想,增加不改变原...

    《Java程序设计案例教程》课程标准.doc

    设置坚持以能力为本位的设计原则,倡导以学生为主体的教育理念,把提高学生的技术 应用能力放在重要位置,形成网络工程设计与施工、网络管理与维护、网站建设与管理 、信息类网络基础服务和网络信息安全建设五项专业...

    软件工程知识点

    (1)工程方法:结构化方法、JSD方法、面向对象方法。 (2)软件工具:具有自动化特征的软件开发集成支撑环境。 (3)工程过程:在软件工具支持下的一系列工程活动,基本活动是软件定义、软件开发、 软件验证、软件...

    软件设计师重点考点

    1.7.1面向对象的基本概念 133 1.7.2面向对象的分析方法 135 1.7.3面向对象设计方法 136 1.8软件质量(重点) 137 1.8.1八项质量管理原则 138 1.8.2十三个步骤: 140 1.9软件配置管理 140 1.10软件过程改进 142 专题八...

    精通matlab6.5

    第七章 M文件和面向对象编程 7.1 入门 7.2 M文本编辑器 7.3 MATLAB控制流 7.4 脚本文件和函数文件 7.5 变量的检测传递和限权使用函数 7.6 串演算函数 7.7 函数句柄 7.8 创建用户工具箱 7.9 调试和剖析 7.10 面向对象...

    短信平台设计方案.pdf

    面向对象设计和实现的重点是多个对象的网状组织结构和协同 计算,而不是过程调用的层次结构,这样就在本质上适应了并发、分布 系统及互联网的计算特征。 2.2、系统总体框架 在整个系统的设计上,在保证系统效率的...

    JAVA基础课程讲义

    面向对象编程的语言的三大特征简介 56 对象和类的概念 56 类和对象初步 57 测试类的定义方式 57 简单的学生类编写示例 58 内存分析 59 属性(field,或者叫成员变量) 59 引用类型 60 类的方法 60 对象的创建和使用 ...

    重构-改善既有代码的设计(chm清晰版)

    Martin Fowler和本书另几位作者清楚揭示了重构过程,他们为面向对象软件开发所做的贡献,难以衡量。本书解释重构的原理(principles)和最佳实践方式(best practices),并指出何时何地你应该开始挖掘你的代码以求...

    网络营销初级培训教程.doc

    5 四、 网络营销基本原则 6 五、 网络营销基本特点 6 六、 网络营销的优势 8 七、 网络营销理论基础 8 八、 网络营销的作用与职能 10 九、 网络营销常用方法 12 1、搜索引擎营销 12 2、交换链接 12 3、网络广告 12 ...

    javalruleetcode-cs_offer:对于cs_offer

    三大原则(继承、封装、多态)、类图、设计原则。 数据库 事务、锁、隔离级别、MVCC、间隙锁、范式。 SQL 基本语法。 Leetcode 上数据库题目的解题记录。 存储引擎、索引、查询优化、切分、复制。 五种数据类型、...

Global site tag (gtag.js) - Google Analytics