设计模式学习笔记(0)-设计原则
发布日期:2021-11-12 00:26:28 浏览次数:3 分类:技术文章

本文共 3935 字,大约阅读时间需要 13 分钟。

对于设计模式,我一直认为在开发过程中是比较重要的。学习设计模式,有助于使代码的架构更合理,提高开发的效率。

之前,曾经看过设计模式的书籍,但是看完就忘,现在想想,可以通过写博客的形式一方面让自己的学习不中断,另一方面能在学习时,对所学的东西做一个总结。

学习设计模式,其实设计的原则也是挺重要的。设计的原则在设计模式中也能很好的体现。

今天就先记录一下学习的设计原则的内容。

-------------------------------------------------------------------------------------------------------------------------------------------------------------

--------------------------------------------正文:设计原则-------------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------------------------------------------------------------------------------

设计原则:

1、单一职责原则
定义
:就一个类而言,应该只有一个引起它变化的原因。如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会影响到其他的职责。
理解:单一类的的功能要简单。以人员操作类为例,这个类的功能就是人员增删查改。如果要增加人员的其他操作,可以通过继承来实现。毕竟多数的功能的基本就是增删查改而已。
2、开闭原则
定义
:一个软件实体(指的类、函数、模块等)应该对扩展开放,对修改关闭。即每次发生变化是,要通过添加新的代码来增强现有类型的行为,而不是修改原有的代码。
符合开闭原则的最好方式是提供一个固有的接口,然后让所有可能发生变化的类实现该接口,让固定的接口与相关对象进行交互。
理解:这点在后台服务开发的时候,体现的比较明显。比如,某个接口服务因为一些原因,需要修改参数或者返回值,这时候需要新增一个方法,重新定义参数和返回值,而不是修改原有的方法。尤其APP的后台接口,如果修改原有方法会影响旧版本的使用。
3、里氏代替原则
定义
:Liskov Substitution Principle,LSP(里氏代替原则)指的是子类必须替换掉他们的父类型。也就是说,在软件开发过程中,子类替换父类后,程序的行为是一样的。只有子类替换掉父类后,此时软件的功能不受影响时,父类才能真正的被复用,而子类也可以在父类的基础上添加新的行为。
理解:这点其实也是和开闭原则想符合的。不去修改任何软件实体,包括父类,可以扩展而不是去修改。当然前提是父类的设计是合理的前提下。
我们在设计过程中,一定要谨慎的去进行每个类的设计。不然如果修改某个父类,那引起的麻烦就很大了。
4、依赖倒置原则
定义
:依赖倒置(Dependence Inversion Principle, DIP)原则指的是抽象不应该依赖于细节,细节应该依赖于抽象,也就是提出的“面向接口变成,而不是面向实现编程”。这样可以降低客户与具体实现的耦合。
理解:这个针对的是抽象的原则。也可以理解为抽象是基于共性抽象,而不是基于某个个性抽象。其实也可以理解为3中的意思。抽象一旦定义,就不能去修改了,不然会给其他的继承带来麻烦。
比如著名的白马非马的故事,马是共性,马的特点有很多,比如四条腿,有蹄子,有尾巴,善于奔跑,脸是长的等等,但是如果把白色也作为马的抽象,那就没法扩展了。
5、接口隔离原则
定义
:接口隔离原则(Interface Segregation Principle, ISP)指的是使用多个专门的接口比使用单一的总接口要好。也就是说不要让一个单一的接口承担过多的职责,而应把每个职责分离到多个专门的接口中,进行接口分离。过于臃肿的接口是对接口的一种污染。
理解:这个原则符合单一职责原则。最底层的接口功能一定要简单。如果实现复杂的功能,那么这个功能,可以说不会是普遍使用的。接口的简单更加有利于功能的扩展。比如表头的新增方法和明细的新增方法,在设计时一定要分开。如果要实现某一单据的新增,调用表头和明细的方法即可,而不需要把表头和明细新增的实现过程再写一遍。这样,有利于代码的简洁性。
6、合成复用原则
定义
:合成复用原则(Composite Reuse Principle, CRP)就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分。新对象通过向这些对象的委派达到复用已用功能的目的。简单地说,就是要尽量使用合成/聚合,尽量不要使用继承。
理解:其实,我也对这句里的尽量不要使用继承比较疑惑。继承肯定有一定的好处,子类可以拥有父类的所有属性。什么时候使用继承才合适呢?
在网上找了一下这个原则的资料,这个说法我感觉还是挺不错的:
-------------------引用自http://www.cnblogs.com/shaosks/archive/2012/02/08/2342593.html---------
只有当以下的条件全部被满足时,才应当使用继承关系。
         1. 子类是超类的一个特殊种类,而不是超类的一个角色,也就是区分“Has-A”和“Is-A”.只有“Is-A”关系才符合继承关系,“Has-A”关系应当使用聚合来描述。
注解:白马才能继承马这个类,而龙有马一样的脸只是拥有马的其中一个属性,这时候就不能继承马类了。
         2 .永远不会出现需要将子类换成另外一个类的子类的情况。如果不能肯定将来是否会变成另外一个子类的话,就不要使用继承。
注解:白马可以继承马这个类,要是四不像,开始看着像马,但是看着又想别的生物,不确定的情况下,就不能使用继承了。
         3 .子类具有扩展超类的责任,而不是具有置换掉或注销掉超类的责任。如果一个子类需要大量的置换掉超类的行为,那么这个类就不应该是这个超类的子类。
注解:继承是为了更好的使用父类,如果要改掉父类的多数东西,那使用继承也就不好了。
-----------------引用完毕----------------------------------------------------------------------
7、迪米特法则
定义
:迪米特法则(Law of Demeter,LoD)又叫最少知识原则(Least Knowledge Principle,LKP),指的是一个对象应当对其他对象有尽可能少的了解。也就是说,一个模块或对象应尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立,这样当一个模块修改时,影响的模块就会越少,扩展起来更加容易。
  关于迪米特法则其他的一些表述有:只与你直接的朋友们通信;不要跟“陌生人”说话。
理解:迪米特法则的初衷在于降低类之间的耦合。由于每个类尽量减少对其他类的依赖,因此,很容易使得系统的功能模块功能独立,相互之间不存在(或很少有)依赖关系。
    迪米特法则不希望类之间建立直接的联系。如果真的有需要建立联系,也希望能通过它的友元类来转达。因此,应用迪米特法则有可能造成的一个后果就是:系统中存在大量的中介类,这些类之所以存在完全是为了传递类之间的相互调用关系——这在一定程度上增加了系统的复杂度。
下边这段内容,我认为有助于加深对这一原则的理解:
-------------------引用自http://www.cnblogs.com/wisdo/p/4178723.html-----------
 在运用迪米特法则到系统的设计中时,要注意以下几点:
     第一:在类的划分上,应当创建弱耦合的类,类与类之间的耦合越弱,就越有利于实现可复用的目标。
    第二:在类的结构设计上,每个类都应该降低成员的访问权限。
    第三:在类的设计上,只要有可能,一个类应当设计成不变的类。
    第四:在对其他类的应用上,一个对象对其他类的对象的应用应该降到最低。
    第五:尽量限制局部变量的有效范围。
---------------------引用完毕---------------------------------------------------

下周,将开始对具体的设计模式进行学习。

知行办公,专业移动办公平台 https://zx.naton.cn/
【总监】十二春秋之,3483099@qq.com;
【Master】zelo,616701261@qq.com;
【运营】运维艄公,897221533@qq.com;
【产品设计】流浪猫,364994559@qq.com;
【体验设计】兜兜,2435632247@qq.com;
【iOS】淘码小工,492395860@qq.com;iMcG33K,imcg33k@gmail.com;
【Android】人猿居士,1059604515@qq.com;思路的顿悟,1217022114@qq.com;
【java】首席工程师MR_W,feixue300@qq.com;
【测试】土镜问道,847071279@qq.com;
【数据】fox009521,42151960@qq.com;
【安全】保密,你懂的。

转载地址:https://blog.csdn.net/fox009521/article/details/78354261 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:七大常见排序算法总结
下一篇:一文总结学习 Python 的 14 张思维导图

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年03月26日 04时36分04秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

iphone通讯录 android,3个方法,教你如何快速而又有效的将联系人从iPhone转移到安卓... 2019-04-21
android horizontalscrollview 滑动事件,ScrollView的滑动监听(以HorizontalScrollView为例) 2019-04-21
win7自定义html为桌面,Win7系统自定义桌面主题的方法 2019-04-21
单系统 台电x80pro_台电x80 pro (ID:E3E6)安装remix OS系统教程整理 2019-04-21
linux存储pdf伟岸_python的reportlab库介绍、制作pdf和作图 2019-04-21
安徽信息技术初中会考上机考试模拟_2020年中小学寒假、考试时间定下了! 2019-04-21
ubuntu 退出anaconda环境_从零开始深度学习第15讲:ubuntu16.04 下深度学习开发环境搭建与配置... 2019-04-21
稳定币usda是哪个发行的_武夷山币装帧款曝光,共4款设计,你喜欢哪款? 2019-04-21
可变车道怎么走不违章_走ETC竟比人工车道贵50%!交警:这3点不知道,吃亏的是自己... 2019-04-21
苹果笔记本的end键_笔记本用户的大烦恼:触控板,想好好用你不容易 2019-04-21
趣玩机器人什么时候成立的_【直播回顾】当我们谈机器人集成调试的时候在谈什么... 2019-04-21
中考大数据大连79_中考大数据 | 大连部分初中2019年中考指标生录取最低分及人数统计!... 2019-04-21
vue 地理位置定位_HTML5地理位置 2019-04-21
pac代理模式什么意思_托管仓库租赁电商仓储运营模式托管什么意思 2019-04-21
validated 验证数组_在 Laravel 中处理请求验证的智能方法 2019-04-21
洞泾智能机器人产业基地_G60科创走廊洞泾人工智能产业基地(核心区块)暨洞泾镇招商人员培训班顺利开班... 2019-04-21
java 拼接路径优雅方式_Java安全编码实践总结 2019-04-21
realme x2 深度测试打不开_搭载65W超级闪充,realme真我X7手机充电评测 2019-04-21
整数取反编程_【每日编程185期】数字的补数 2019-04-21
能用别的软件吗_手机软件能用蓝牙传送吗 2019-04-21