设计模式6大原则

六原则一法则

s( Single-Resposibility Principle ) : 单一职责原则。
o( Open-Closed principle )          : 开放封闭原则。
l( Liskov-Substituion Principle )   : 里氏替换原则。
d( Dependecy-Inversion Principle )  : 依赖倒置原则。
i( Interface-Segregation Principle ): 接口隔离原则。合成/聚合复用。迪米特法则(最少知道)

(1)单一职责

一个类的功能要单一, 一个类只负责一个职责。 一个类只做它该做的事情(高内聚)

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

 作用

  如果只让一个类完成它该做的事,而不涉及与它无关的领域就是践行了高内聚的原则

(2)开放-封闭

  软件实体(类、模块、函数等) 对修改关闭。 对扩展开放

  • 有新的需求或变化时, 可以对现有代码进行扩展, 以适应新的情况。
  • 对修改封闭, 意味着类一旦设计完成, 就可以独立其工作, 而不要对类尽任何修改。
    • 在开发阶段, 我们都知道, 如果对一个功能进行扩展, 如果只是一味地对方法进行修改, 可能会造成一些问题, 诸如可能会引入新的 bug,
    • 或者增加代码的复杂度, 对代码结构造成破坏、 冗余, 还需要重新进行全面的测试。 那么该怎么解决这些问题? 很简单,这就需要系统能 够支持扩展, 只有扩展性良好的系统, 才能在不进行修改已有实现代码的基础上, 引进新的功能。

 作用

     可维护性,可扩展性,可复用,灵活性好

(3)里氏替换

   任何使用基类的地方, 都能够使用子类替换, 而且在替换子类后, 系统能够正常工作。

  • 子类一定是增加父类的能力而不是减少父类的能力, 因为子类比父类的能力更多, 把能力多的对象当成能力少的对象来用当然没有任何问题。
  • 一个软件实体如果使用的是一个基类, 那么当把这个基类替换成继承该基类的子类, 程序的行为不会发生任何变化。软件实体察觉不出基类对象和子类对象的区别。

 作用

  1. 提高代码的重用性,子类拥有父类的方法和属性;
  2. 提高代码的可扩展性,子类可形似于父类,但异于父类,保留自我的特性;

 不足

   1. 继承是侵入性的,只要继承就必须拥有父类的所有方法和属性,在一定程度上约束了子类,降低了代码的灵活性;
   2. 增加了耦合,当父类的常量、变量或者方法被修改了,需要考虑子类的修改,所以一旦父类有了变动,很可能会造成非常糟糕的结果,要重构大量的代码。

(4)接口隔离

   使用多个专门的接口比使用单一的总接口要好。一个类对另外一个类的依赖性应当是建立在最小的接口上的。

  • 将接口粒度最小化,将功能划分到每一个不能再分的子角色, 为每一个子角色创建接口通过这样,才不会让接口的实现类实现一些不必要的功能。
  • 建立单一的接口, 不要建立臃肿的庞大的接口, 也就是说接口的方法尽量少。接口要小而专, 绝不能大而全。 臃肿的接口是对接口的污染,既然接口表示能力,那么一个接口只应该描述一种能力, 接口也应该是高度内聚的。

  作用

   实现模块间的松耦合

(5)依赖倒置

   我们的类要依赖于抽象, 而不是依赖于具体, 也就是我们经常听到的“要面向接口编程” 。

  • 该原则说得具体一些就是声明方法的参数类型、 方法的返回类型、 变量的引用类型时, '尽可能使用抽象类型而不用具体类型,因为抽象类型可以被它的任何一个子类型所替代
    (1)高层模块不应该依赖低层模块,两个都应该依赖抽象
    (2)抽象不应该依赖细节,细节应该依赖抽象

 作用

   通过抽象(抽象类或接口) 使各个类或模块的实现彼此独立, 不相互影响, 实现模块间的松耦合。 减少类间的耦合性。

(6)合成/聚合复用

将已有对象纳入到新对象中,使之成为新对象的一部分,因此新对象可以调用已有对象的功能。

  • 在面向对象设计中,如果直接继承基类,会破坏封装,因为继承将基类的实现细节暴露给子类;如果基类的实现发生改变,则子类的实现也不得不发生改变;从基类继承而来的实现是静态的,不可能在运行时发生改变,没有足够的灵活性。
  • 于是就提出了合成/聚合复用原则,也就是在实际开发设计中,尽量使用合成/聚合,不要使用类继承.一般而言,如果一个角色得到了更多的责任,那么可以使用合成/聚合关系将新的责任委派到合适的对象。当然,这种复用也有缺点。
  • 最主要的缺点就是通过这种复用建造的系统会有较多的对象需要管理。

迪米特法则(最少知道法则)

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

  • 在类的结构设计上,每个类都应当尽量降低成员的访问权限

 作用

   类间解耦,降低耦合度,只有弱耦合之后,类的复用性才可以提高

设计模式6原则1法则相关推荐

  1. 设计模式“六原则一法则”

    1. 单一职责原则:一个类只做它该做的事情.(单一职责原则想表达的就是"高内聚",写代码最终极的原则只有六个字"高内聚.低耦合",就如同葵花宝典或辟邪剑谱的中心 ...

  2. 面向对象回顾(构造函数、覆盖和重载、Query接口的list方法和iterate方法、面向对象的六原则一法则、反射、内部类)

    1. 什么是构造函数?什么是构造函数重载?什么是复制构造函数? 当新对象被创建的时候,构造函数会被调用. 每一个类都有构造函数. 在程序员没有给类提供构造函数的情况下,Java编译器会为这个类创建一个 ...

  3. PHP 设计模式六大原则

    http://www.cnblogs.com/yujon/p/5536118.html 设计模式六大原则(1):单一职责原则 不要存在多于一个导致类变更的原因.通俗的说,即一个类只负责一项职责 设计模 ...

  4. java常用代码解析_Java设计模式常用原则代码解析

    本篇文章小编给大家分享一下Java设计模式常用原则代码解析,代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 1.单一职责原则每一个类负责一个职责(一个类只有 ...

  5. Java 设计模式六大原则

    Java 设计模式六大原则 单一职责原则 定义:不要存在多于一个导致类变更的原因.通俗的说,即一个类只负责一项职责. 问题由来:类T负责两个不同的职责:职责P1,职责P2.当由于职责P1需求发生改变而 ...

  6. 快速理解设计模式六大原则

    设计模式的核心总结起来就一句话:用抽象构建框架,用实现扩展细节.目的就是代码修改的改动量最小 设计模式六大原则 单一职责原则 很好理解,一个类职责要单一,不要承载过多的职责,就比如说我们电脑上所有的文 ...

  7. Java面试之设计模式七大原则

    最近项目不太忙,不怎么加班,正利用晚上时间好好学习学习设计模式,之前可能多多少少都用到过,但是有些还是很模糊,这下正好系统的学一下. 好了,话不多说,进入正题. 1.什么是设计模式? 软件工程中,设计 ...

  8. 子慕谈设计模式系列(二)——设计模式六大原则

    六大原则 单一职责原则 里氏替换原则 依赖倒置原则 接口隔离原则 迪米特法则 开闭原则 前言 设计模式不容易用文字描述清楚,而过多的代码,看起来也让人摸不到头脑,加上词语或者文字描述的抽象感,很容易让 ...

  9. 第 2 章 设计模式七大原则

    第 2 章 设计模式七大原则 1.设计模式的目的 编写软件过程中,程序员面临着来自 耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性 等多方面的挑战, 设计模式是为了让程序(软件),具有如下更好的 ...

最新文章

  1. 四、双向链表的操作分析和代码实现
  2. LeetCode-1.Two Sum
  3. npm nodejs包管理工具 简介
  4. 代码重构阅读心得[转]
  5. IntelliJ IDEA 修改包名
  6. 通用测试用例大全(转自——知了.Test)
  7. 回溯法之避免无用判断 UVA129 Krypton Factor困难的串
  8. 理解React-组件生命周期
  9. r软件时间序列分析论文_高度比较的时间序列分析-一篇论文评论
  10. 前端学习(3132):react-hello-react之受控组件
  11. set row count
  12. springboot 使用spring security
  13. hive中groupby优化_hivesql : hive.groupby.skewindata 和hive.map.aggr 组合的坑
  14. 常见的搜索引擎蜘蛛有哪些
  15. 什么是大数据技术架构
  16. Pandas 重置索引深度总结
  17. Linux CPU使用率超过100%的原因
  18. 4. 上新了Spring,全新一代类型转换机制
  19. 湖州智慧社保显示服务器繁忙,湖州智慧社保
  20. 群晖显示服务器错误代码21,群晖 DSM 6.2.3 升级 25426 错误 21 的解决办法 | 智享阁...

热门文章

  1. 【毕业设计 期末大作业超高分项目】html+php实现图书管理系统详细介绍
  2. Java计时新姿势StopWatch
  3. 无法打开位置服务器,Win10定位服务无法开启灰色不可用怎么办?
  4. 关于Android 5.1 LatinIME的分析
  5. 性格决定命运,习惯决定未来
  6. [图论]剑鱼行动:prim
  7. matlab二维重建程序,matlab三维重建程序
  8. 如何选择才更容易成功?什么才是中国好女票? | 数据周报
  9. C语言学习-黑洞数(C语言代码实现)
  10. python mathjax_Python3 调用 Node.js 解析 MathJax 公式