前面学习了一部分创建型模式,发现了一个比设计模式更重要的东西:设计模式原则。对于设计模式来说,为什么这个模式要这样解决这个问题,而另一个模式要那样,它们背后都遵循的就是永恒的设计原则。可以说,设计原则是设计模式的灵魂。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

三大基本面向对象设计原则:              

1.针对接口编程,而不是针对实现编程 ;2。优先使用对象组全,而不是类继承;3.封装变化点。

         下面开始学习常用的具体的一些设计模式原则:

1.       单一职责原则(SRP

单一职责原则(SRP),就一个类而言,应该仅有一个引起它变化的原因。也就是说,不要把变化原因各不相同的职责放在一起,因为不同的变化会影响到不相干的职责。再通俗一点地说就是,不该你管的事情你不要管,管好自己的事情就可以了,多管闲事害了自己也害了别人。

在软件设计中,如果一个类承担的职责过多,就等于吧这些职责耦合在一起,而一个职责的变化可能会削弱和抑制这个类完成其他职责的能力。这耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到的破坏。

软件设计真正要做的许多内容,就是发现职责并把那些职责相互分离。如果多于一个的动机去改变一个类,那么这个类就具有多余一个的职责,就应该要考虑类的职责分离。

2.       开放-封闭原则(The Open-Closed Principle 简称OCP

开放-封闭原则,或叫开-闭原则,是说软件实体(类、模块、函数等)应该是可以扩展的,但是不可修改。不修改的意思就是是“你可以随便增加新的类,但是不要修改原来的类”。从这个角度去理解就好多了,其实这里还是一个隔离变化的问题。

这个原则的两个特征:一个是对于扩展是开放的;另一个是对于更改是封闭的。

我们在设计开发任何系统时,都不可能指望系统一开始就需求确定,就不再变化(要这样就太幸福了,哈哈),这是不现实的也是不科学的想法。既然需求是有一定变化的,那么如何在面对需求变化时,设计的程序可以相对容易的修改,不至于说,新需求一来,就要把整个程序推倒重来(这样会让程序员疯了不可,哈哈,你不想疯吧)。怎样的设计才能面对需求的改变却可以保持相对稳定,从而使得系统可以在第一个版本以后不断推出的新版本呢?开放-封闭原则就是我们的答案。

在程序设计时,我们要时刻考虑尽量把类设计的足够好,写好了就不要去修改,如果有新的需求来了,我们增加一些类来完成新的需求,原来的代码能不动就不动。

绝对的对修改关闭是不可能的,无论模块是多么的封闭,都会存在一些无法对之封闭的变化,既然不能完全封闭,设计人员必须对他设计的模块应该对那种变化封闭做出抉择、他必须事先猜测出最有可能发生变化的变化种类,然后构建抽象来隔离那些变化。

开放-封闭原则是面向对象设计的核心所在。遵循这个原则可以带来面向对象技术所生成的巨大好处,也就是可维护、可扩展、可复用、灵活性好。开发人员应该仅对程序中呈现出频繁变化的部分都做出抽象,然后,对于应用程序中的每部分都刻意定进行抽象同样不是一个好主意,拒绝不成熟的抽象和抽象本身一样重要。

3.       依赖倒转原则

依赖倒转原则:抽象不应该依赖于细节。细节应该依赖于抽象;高层不应该依赖于底层,两者都应该依赖于抽象。说白了就是要针对接口编程,不要针对实现编程。抽象的东西才是最稳定的,也就是说,我们依赖的是它的稳定。

依赖倒转其实可以说是面向对象设计的标志,用哪种语言来编写程序不重要,如果编写是考虑的都是如何针对抽象编程而不是针对细节编程,即程序中的所有的依赖关系都是终止与抽象类或者接口,那就是面向对象的设计,反之就是过程化设计了。

4.       里氏代换原则

里氏代换原则(LSP):子类型必须能够替换掉他的父类型。说白了就是一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,而他察觉不出父类对象和子类对象的区别,也就是说,在软件里面,把父类都替换成他的子类,程序行为没有变化。

有了里氏替换原则,才是继承服用成为可能,只有当子类可以替换掉父类时,软件的功能不受到影响,父类才能真正被复用,而子类也能够在父类的基础上增加新的行为。

有了里氏代换原则,才能使开放-封闭原则成为可能,正是由于子类型的可替换性才使得父类型的模块在无需修改的情况下扩展。

5.       接口隔离原则(ISP)

接口隔离原则(ISP)

:不应该强迫客户依赖于它们不用的方法。接口属于客户,不属于它所在的类层次结构。这个说得很明白了,再通俗点说,不要强迫客户使用它们不用的方法,如果强迫用户使用它们不使用的方法,那么这些客户就会面临由于这些不使用的方法的改变所带来的改变。

6.    迪米特法则(LoD

迪米特法则(Law of Demeter或简写LoD)又叫最少知识原则(Least Knowledge Principle或简写为LKP):如果两个类不彼此之间直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某个方法的话,可以通过第三者转发这个调用。

         迪米特法则首先强调的前提是在类的结构设计上,每一个类都应当尽量降低成员的访问权限。

迪米特法则其根本思想强调的是类之间的松耦合。类之间的耦合越弱,越利于复用,一个处于弱耦合的类被修改,不会对有关系的类造成波及。

7.    合成/聚合复用原则(Composite/Aggregate Reuse PrincipleCARP

合成/聚合复用原则(Composite/Aggregate Reuse PrincipleCARP):经常又叫做合成复用原则(Composite Reuse PrincipleCRP),就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新对象通过向这些对象的委派达到复用已有功能的目的。我白了就是要尽量使用合成/聚合,尽量不要使用继承。

转载于:https://www.cnblogs.com/peida/archive/2008/06/14/1221049.html

设计模式学习笔记七:常用设计模式原则总结相关推荐

  1. 【我的设计模式学习笔记】洞察设计模式的底层逻辑

    PS: 本文转载于:https://developer.aliyun.com/article/783549 简介 设计模式是开发同学经常聊到的话题,也经常被用到实际的开发项目中,熟练的人可以做到信手拈 ...

  2. 步步为营 .NET 设计模式学习笔记 七、Proxy(代理模式)

    概述 在软件系统中,有些对象有时候由于跨越网络或者其他的障碍,而不能够或者不想直接访问另一个对象,如果直接访问会给系统带来不必要的复杂性,这时候可以在客户程序和目标对象之间增加一层中间层,让代理对象来 ...

  3. 步步为营 .NET 设计模式学习笔记系列总结

    设计模式我从开篇到23种设计模式的讲解总共花了进两个月的时间,其间有很多读者给我提出了很好的建议,同时也指出了我的不足,对此我表示感谢,正是由于很多读者的支持我才能坚持的写到最后.在此表示我真诚的谢意 ...

  4. 设计模式学习笔记清单

    设计模式学习笔记清单 关于设计模式许多人已经耳熟能详,这段时间结合李建忠的教学视频以及大量网络资料,把这部分过了一遍,整理出学习笔记,而真正的深入学习和理解只能在具体的开发环境中日积月累.      ...

  5. 设计模式学习笔记汇总目录

    这里的学习笔记包含JavaSE和J2EE两部分,持续更新中! 其中关于学习的参考资料如下: 1.菜鸟设计模式 2.Head First Design Patterns(书.强烈推荐); 3.大话设计模 ...

  6. 7 种 Javascript 常用设计模式学习笔记

    7 种 Javascript 常用设计模式学习笔记 由于 JS 或者前端的场景限制,并不是 23 种设计模式都常用. 有的是没有使用场景,有的模式使用场景非常少,所以只是列举 7 个常见的模式 本文的 ...

  7. 软件设计模式学习笔记(七)

    软件设计模式学习笔记(七) 结构型模式 1. 组合模式 1.1 概述 ​ 对于这个图片肯定会非常熟悉,上图我们可以看做是一个文件系统,对于这样的结构我们称之为树形结构.在树形结构中可以通过调用某个方法 ...

  8. 设计模式学习笔记(C++实现)(七)--适配器模式

    1.适配器模式简介 英文名称 Adapter 主要目的 该模式可以将一个类的的接口,转换成客户想要的另一个接口. 使用场景 1.当要使用的两个类功能相同或者相似,但仅仅是接口不同时. 2.适配器模式代 ...

  9. 设计模式学习笔记--桥梁(Bridge)模式

    写在模式学习之前 什么是设计模式:在我们进行程序设计时,逐渐形成了一些典型问题和问题的解决方案,这就是软件模式:每一个模式描述了一个在我们程序设计中经常发生的问题,以及该问题的解决方案:当我们碰到模式 ...

最新文章

  1. 编译/链接过程如何工作?
  2. wxWidgets:避免内存泄漏
  3. ubuntu中的Jupyter Notebook更换浏览器需要输入密码
  4. 选取文档元素的API
  5. python社区版可以用库么_应用Python,你不但能够得到出色的小区适用和普遍的库集...
  6. NB-IoT(9)---云平台对接及使用
  7. 用unity协程写的发牌程序
  8. 剑指Offer——Python答案
  9. 百度网盘加速下载Motrix多线程下载器
  10. 分享一个WIN10可用的桌面图标栅栏管理插件Fences的破解版
  11. 跨境电商亚马逊产品运营模式都有哪些
  12. nginx 基本入门
  13. tableu画各类别占比趋势图
  14. 岛屿的最大面积(Java)
  15. amd RX6800和rtx3070哪个好
  16. 让我们用 Node.js 写自己的 DDNS 动态域名程序
  17. C#删除文件和文件夹到回收站
  18. Collections.singleton
  19. 置液晶显示器的台式计算机,台式电脑液晶显示器的底座的制作方法
  20. DHCP的工作原理及过程

热门文章

  1. Windows Mobile 5.0
  2. [DP思考录]向左走,向右走: Observer模式 VS Mediator模式
  3. bootstrap table相关操作
  4. MapReduce之InputFormat理解
  5. (80)FPGA复位激励(function)
  6. 1005打印任务取消不了 hp_惠普HP M1136 MFP多功能打印机 一年半使用感受(学生打印机)...
  7. MFC 获取其他窗口的Edit文本和单击Button
  8. oracle库锁表处理,oracle 数据库锁表处理 ORA-00031
  9. 【Python】变量那些事
  10. Linux内核分析 - 网络[二]:网卡驱动接收报文