深入理解面向对象设计的七大原则

一.面向对象设计的七大原则是什么?

1.开放封闭原则

2.里氏转换原则

3.依赖倒转原则

4.组合/聚合原则

5.接口隔离原则

6.“迪米特”法则

7.单一职责原则

二.七大原则是什么含义?

序号

面向对象设计七大原则

偶的理解

1

开放封闭原则

面向扩展开放,面向修改关闭

2

里氏转换原则

超类存在的地方,子类是可以替换的

3

依赖倒转原则

实现尽量依赖抽象,不依赖具体实现

4

组合/聚合原则

要尽量使用合成/聚合达到复用,而不是继承关系达到复用的目的。

5

接口隔离原则

应当为客户端提供尽可能小的单独的接口,而不是提供大的总的接口

6

“迪米特”法则

又叫最少知识原则,一个软件实体应当尽可能少的与其他实体发生相互作用

7

单一职责原则

每一个类应该专注于做一件事情

 

三.解读七大原则:

1.开放封闭原则

偶的理解

偶是做底层的设计与编码,譬如:车载导航系统的引擎的。该引擎系统包括地图数据格式的解析,图层添加、修改、删除等;地图符号的编辑、显示与润色,基于两个地点之间的最短时间/最短距离的路径规划等等功能。

 

做车载导航系统的应用层的同事,不能修改偶核心层代码,也就是说您不能修改偶的接口,但是您可以针对偶的接口做一些扩展。也就是:对接口的修改是封闭,但是对接口的扩展是开放。

为什么这样?

1.同事修改偶的核心层代码不合适,毕竟这些偶是专门整天研究这个的,偶专业呀;

2.同事为了自己的一己私利,修改了接口(如添加参数,修改了参数数据类型或者去掉某个参数),但是基于偶的核心车载导航引擎的,不只同事一个人用,好多同事与第三方公司都编译不过,一堆会找上门来,骂你个狗血喷头;

3.但是同事,将偶的引擎接口扩展了,自己用,影响不到其他人,多好的一件事情;

2.里氏转换原则

任何基类可以出现的地方,子类一定可以出现。即超类存在的地方,子类是可以替换的。替换后行为不变,结果会变化。调用子类行为。

子类和父类必须有相同行为才能完全地实现替换。

实现开闭原则的关键是抽象化,而里氏代换原则中的基类和子类的继承关系正是抽象化的具体体现,所以里氏代换原则是对实现抽象化的具体步骤的规范。违反里氏代换原则

偶的理解

想通过基类的指针,调用虚拟函数,搞多态,让一个函数,针对不同的派生类指针,会有不同的表现行为。派生类的虚拟函数,不能搞特殊。派生类的指针不能赋值给基类,哪就胡扯。

 

里氏代换原则是要求我们在使用继承时,必须满足一定的条件。不能为了复用,一味去继承。

3.依赖倒转原则

抽象不应该依赖细节。细节应该依赖抽象。

偶的理解

设计接口的时候,不应该说俺设计的这一个接口,就是给这个某一个具体实现功能而设计。

哪就不叫面向对象设计了,抽象了也啥意思。因为你只为某一个具体功能而设计。

 

但是具体编码实现某一个功能,还是要依赖于某一具体的接口的。

 

注意这是面向对象设计,设计什么呢?设计接口。接口是一个一对多的关系。一对多啥意思,就是一个接口,有多种实现。

 

哦!明白了。多态,讲的就是这个意思,一个接口,多种行为方式。挂上钩了。O(∩_∩)O~。

类似:活着与吃饭的关系

活着不是为了吃饭,但是吃饭为了活着。

4.组合/聚合原则

偶的理解

《设计模式》里23个模式,就是整篇整篇地讲如何类与类之间的组合/聚合。

 

如果为了复用,便使用继承的方式将两个不相干的类联系在一起,违反里氏代换原则,哪是生搬硬套,忽略了继承了缺点。

 

继承的缺点有:

 

1、继承复用破坏数据封装性,将基类的实现细节全部暴露给了派生类,基类的内部细节常常对派生类是透明的,白箱复用。

虽然简单,但不安全,不能在程序的运行过程中随便改变。

 

2、基类的实现发生了改变,派生类的实现也不得不改变。

 

3、从基类继承而来的派生类是静态的,不可能在运行时间内发生改变,因此没有足够的灵活性。

5.接口隔离原则

应当为客户端提供尽可能小的单独接口,而不要提供大的总接口。暴露行为让后面的实现类知道的越少越好。

偶的理解

人家需要什么,你给人家提供什么。

否则如果接口给人家提供多了,暴露多了,自己的麻烦不少。人家会问:

1.这个接口是干什么的,怎么用啊;

2.这个接口与另外一个接口有什么区别啊?又有什么联系啊?什么情况下用这个接口,什么情况下用另外一个接口;

 

总之,问得你烦死了,烦透了。最后,没办法,只好弄一个版本,就是提供客户需要的接口,告诉他如何使用,一了百了。清闲自在多了。

 

真是你好!我好!大家好!

 

一旦某个漂亮的女孩子穿衣服,要是暴露多了,又露胸,又露屁股,被人家一阵狂扁,“看哪个不要脸的狐狸精”,“伤风败俗,缺家教”,“看又一个暴露狂”。搞的人家MM都要奔溃,跳黄河自杀。偶算明白了。技术原理来源于生活。道理都是相通的。O(∩_∩)O~

6.“迪米特”法则

又叫最少知识原则,一个对象对另一个对象知道的越少越好,即一个软件实体应当尽可能少的与其他实体发生相互作用。

 

如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一方法的话,可以通过第三者转发这个调用。

偶的理解

一个类包装好自己的private状态和方法,不需要让别的类知道字段或者行为,就不要公开哟!

 

强调类之间的松耦合。

 

类与类之间的耦合性越低,一旦一个处于弱耦合的类的代码被修改了,不会对有关系的类造成波及与影响。这样,这个类的复用性大大增强,提高了开发效率,降低了出错的可能性。

 

哥最怕的是修改了某一个不起眼的类一点代码,跟她发生关系的类太多。牵一发而动全身。会发生多米诺效应。咱可惹不起。谁知道,会出现什么后果!汗颜!

7.单一职责原则

每一个类应该专注于做一件事情。

偶的理解

这个讲的就是商业领域里面的定位概念。想打官司,找律师;想看病,找医生;想学习,找老师。

 

一个类一个具体作用,如微软的VC MFC里的CBrush、CPen、CFont等就是这个意思,想搞字体用CFont,想用画笔用CPen,想用刷子,用CBrush。各司其责,一目了然。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/255675.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mybatis实战教程(mybatis in action)之二:以接口的方式编程

前面一章,已经搭建好了eclipse,mybatis,mysql的环境,并且实现了一个简单的查询。请注意,这种方式是用SqlSession实例来直接执行已映射的SQL语句:session.selectOne("com.yihaomen.mybatis.models.UserMapper.selectUserByID&…

Linux内核分析06

进程的描述和进程的创建 一,进程的描述 进程控制块PCB——task_struct (进程描述符),为了管理进程,内核必须对每个进程进行清晰的描述,进程描述符提供了内核所需了解的进程信息。 struct task_struct数据结…

【pyqt5学习】——pyqt5中.qrc资源文件的创建与编写

目录 一、说明 二、安装pyqt5以及相关工具(pyqt5、pyuic、pqrcc) 三、创建.ui文件 1、选中文件右键-external-pyqt5 打开GUI设计界面 2、创建一个界面(内含四个等大label框) 3、CTRLS保存 4、找到ui文件,右键--e…

zabbix3.0.4通过jmx监控tomcat

jdk下载页面http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.htmlhttp://download.oracle.com/otn-pub/java/jdk/8u91-b14/jdk-8u91-linux-x64.rpm?AuthParam1462948138_871b75d4b1dd7155e8cbe4f23e5cd2cd脚本[rootNFS-WEB1 latest]# vim /e…

C#学习笔记——25个经典问题

1.静态成员和非静态成员的区别? 2.const 和 static readonly 区别? 3.extern 是什么意思? 4.abstract 是什么意思? 5.internal 修饰符起什么作用? 6.sealed 修饰符是干什么的? 7.override 和 o…

PHP的学习--RSA加密解密

PHP服务端与客户端交互或者提供开放API时,通常需要对敏感的数据进行加密,这时候rsa非对称加密就能派上用处了。 举个通俗易懂的例子,假设我们再登录一个网站,发送账号和密码,请求被拦截了。 密码没加密,那攻…

Swift学习

1、Swift网址 http://swiftdoc.org/ 2、 https://github.com/ipader/SwiftGuide 转载于:https://www.cnblogs.com/superbobo/p/5329876.html

【pyqt5学习】——最新版:配置external tools(designer、pyuic、pqrcc)

目录 1、pip install PyQt5 2、pip install pyqt5-tools 3、file-settings-tools-external tool 点击加号定义工具名字,名字随意便于区分即可 双击每一个工具名字,配置路径(注意每一个exe的路径) designer.exe pyuic.exe py…

Linux中vi命令详解

最近vi用的多,很多技巧不知道,备注一份, vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令。由于 对Unix及Linux系统的任何版本&…

C# 属性和字段

以下的文章是摘录的,作者已经不详了。之所以摘录,是因为这个概念很重要特别对于VFP程序员来说,这里构造属性就与vfp的方法完全不同。c#的属性融合了vfp的addproperty() 和属性的access method和assign method 。不一而足使用属性&#xff0c…

SEO优化---学会建立高转化率的网站关键词库

想要优化好一个网站,行业的分析,以及关键词的挖掘是必要的,有一定的关键词排名了,但是转化率和流量方面却很不理想这种情况大部分是只注重了有指数的关键词排名,而忽略了长尾关键词和一些没有指数但是可以带来巨大流量的关键词。 网站大部分的…

Monkey脚本编写

脚本优势:简单、快捷、不需要借助任何工具,可以做简单的性能测试 脚本缺点:只能简单实现坐标、按键等基本操作,无逻辑性 脚本格式: 脚本API: 例子: 打开浏览器,输入WWW.jikexueyuan.…

C#通过DllImport引入dll中的C++非托管类

首先从msdn了解到,DllImport是用来 将特性化方法由非托管动态链接库 (DLL) 作为静态入口点公开。 从以上语句我们可以理解出三点:1.C编写的非托管dll可以通过DllImport引入到C#中;2.引入到C#中的只能是C方法(或者说函数&#xff0…

USB 设备类协议入门【转】

本文转载自:http://www.cnblogs.com/xidongs/archive/2011/09/26/2191616.html 一、应用场合USB HID类是比较大的一个类,HID类设备属于人机交互操作的设备。用于控制计算机操作的一些方面,如USB鼠标,USB键盘,USB游戏操…

lucene之Field属性的解释

Field类 数据类型 Tokenized是否分词 Indexed 是否索引 Stored 是否存储 说明 StringField(FieldName, FieldValue,Store.YES)) 字符串 N Y Y或N 这个Field用来构建一个字符串Field,但是不会进行分析,会将整个串存储在索引中,比如…

【机器视觉】——焦距计算物体实际尺寸计算

目录 1.基本概念 2.像素尺寸(piex)转为实际尺寸(mm) 3.焦距计算

Tableview中Dynamic Prototypes动态表的使用

Tableview时IOS中应用非常广泛的控件,当需要动态的添加多条不同的数据时,需要用动态表来实现,下面给出一个小例子,适用于不确定Section的数目,并且每个Section中的行数也不同的情况,适合新手。首先&#xf…

c# - 声明事件

1 事件是属于一个特定的类的,其本质是只能在此类中调用的委托。 从面向对象的角度出发,事件是对象对某个消息的响应,因此其声明必然只能在类的级别出现,且不可用static修饰。 2 事件其实和属性差不多,是一种特殊的方法…

appium 环境搭建 java

1 安装node.js 1.1 安装node.js http://nodejs.cn/download/ 1.2、下载后直接点击exe,按照提示一步一步的安装 1.3 安装成功后,运行cmd,输入node –v,如果安装成功,会输出如下版本信息 2 eclipse android开发环境搭建 2.1 用eclip…

【数据库bug修复】——Authentication plugin ‘caching_sha2_password‘ is not supported

目录 原因 连接数据库的时候出现这个问题的解决方法 创建数据库连接池时解决方法 原因 使用客户端链接mysql数据库,如果数据库版本高于8.0,可能出现以上问题,因为8.0以前默认使用mysql_native_password身份验证机制,8.0以后使用…