一、单一职责原则

单一职责原则:一个类只负责一个功能领域中的相应职责,或者可以定义为:就一个类而言,应该只有一个 引起它变化的原因。

就是说一个类不能太”累“,一个类承担的责任越多,它被复用的肯能性就越小,而且一个类承担的责任过多,就相当于将这些职责耦合在一起,

当其中一个职责变化时,可能会影响到其他职责的运作,因此要将这些职责分离,封装在不同的类中。

单一职责的原则就是:实现高内聚、低耦合的指导方针,它是简单但是又难运用的原则,需要设计人员发现类的不同职责将其分离,而发现类的多重职责需要设计人员具有较强的

分析能力和设计能力和相关实践经验。

二、开闭原则

开闭原则:一个软件实体可以指一个应当对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。

在开闭原则的定义中,一个软件实体可以指一个软件模块,一个由多个类组成的局部结构或一个独立的类。

为了满足开闭原则,需要对系统进行抽象设计,抽象化是开闭原则的关键。可以定义一个相对稳定的抽象层,在通过具体类来进行扩展,

如果有需要改动系统的行为,无需对抽象层进行任何改动,只需要增加新的具体类来实现新的业务功能即可,实现在不修改已有代码的基础上扩展系统的功能,达到开闭原则的要求。

三、里氏替换 原则

里氏替换原则:所有引用基类的地方必须能透明地使用其子类的对象。

里氏替换原则告诉我们,在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立。

如果一个软件实体使用的是一个子类对象的话,那么它不一定能够使用基类对象。例如:我喜欢动物,那我一定喜欢狗,因为狗是动物的子类;

但是我喜欢狗,不能断定我喜欢动物。

里氏替换原则是实现开闭原则的重要方式之一,由于使用基类对象的地方都可以使用子类对象,因此在程序中尽量使用基类类型来定义对象 ,

而在运行时再确定其子类类型,用子类对象来替换父类对象。

四、依赖倒置原则

依赖倒置原则:抽象不应该依赖于细节,细节应当依赖于抽象。

如果说开闭原则是面向对象设计的目标的话 ,那么依赖倒置原则就是面向对象设计的主要实现机制之一,它是系统抽象化的具体实现。

依赖倒置原则要求我们在程序代码中传递参数时或在关联关系中,尽量引用高层次的抽象层类,即使用接口和抽象类进行变量类型声明、方法返回类型声明,

以及数据类型的转换等,而不要用具体类来做这些事情。为了确保该原则的应用,一个具体类应当实现接口和抽象类中声明过的方法,而不要给多余的方法,

否则将无法调用到子类中增加的新方法。

在实现依赖倒置原则时,我们需要针对抽象层编程,而将具体类的对象通过依赖注入的方式注入到其他对象中,依赖注入是指当一个对象要与其他对象发生依赖关系时,

通过抽象来注入所依赖的对象。常用的注入方式有三种,分别是:构造注入,设值注入和接口注入。构造注入是指通过构造函数来传入具体类的对象,设值注入是指通过Setter

方法来传入具体类的对象,而接口注入是指通过在接口中声明的业务方法来传入具体类的对象。这些方法在定义时使用的是抽象类型,在运行时再传入具体类型的对象,由子类对象覆盖父类对象。

五、接口隔离原则

每一个接口应该承担一种相对独立的角色,不干不该干的事,该干的事都要干。

接口仅仅提供客户端需要的行为,客户端不需要的行为则隐藏起来,应当为客户端提供尽可能小的单独的接口,而不要提供大的接口。

但是接口不能太小,如果太小会导致系统中接口泛滥,不利于维护。

六、迪米特法则

迪米特法则:一个软件实体应当尽可能少的与其他实体发生相互作用。

迪米特法则可降低系统的耦合度,使类与类之间保持松散的耦合关系。

迪米特法则还有几种定义形式,包括:不要和“陌生人”说话,只与你的直接朋友通信等。

其朋友包括以及几类:

(1)当前对象本身

(2)以参数形式传入到当前对象方法中的对象

(3)当前对象的成员对象

(4)如果当前对象的成员对象是一个集合,那么集合中的元素也是朋友

(5)当前对象所创的对象

任何一个对象,如果不满足上面的条件之一,就是当前对象的“朋友”,否则就是“陌生人”。

迪米特法则要求我们在设计系统时,应该尽量减少对象之间的交互,如果两个对象之间不必彼此直接通信,那么这两个对象就不应当发生任何直接的相互作用,

如果其中的一个对象需要调用另一个对象的某一个方法的话,可以通过第三者转发这个调用。简而言之,就是通过引入一个合理的第三者来降低现有对象之间的耦合度。

在将迪米特法则运用到系统设计中时,要注意下面的几点:在类的划分上,应当尽量创建松耦合的类,类之间的耦合度越低,就越有利于复用,一个处在松耦合中的类一旦被修改,

不会对关联的类造成太大波及;在类的结构设计上,每一个类都应当尽量降低其成员变量和成员函数的访问权限;

在类的设计上,只要有可能,一个类型应当设计成不变类;在对其他类的引用上,一个对象对其他对象的引用应当降到最低。

转载于:https://www.cnblogs.com/BounceGuo/p/9724969.html

设计模式的六大原则(个人笔记)相关推荐

  1. 【设计模式 00】设计模式的六大原则

    设计模式的六大原则 参考: 设计模式六大原则 1. 单一职责原则 一个类只负责一个明确的功能 优点: 降低类的复杂度,提高代码可读性和可维护性 降低变更时对其他功能的影响 2. 里氏替换原则 **原则 ...

  2. 神了!有人用一个项目把23种设计模式与六大原则融会贯通了

    前言 设计模式分为三类,创建型,结构型和行为型.创建型比较好理解,它抽象了实例化过程,将系统与实例的创建解耦.实例由专门的工厂来创建,从而使系统针对实例的抽象接口编程,不依赖任何具体的实现.结构型和行 ...

  3. 如何理解设计模式的六大原则?

    我们知道,java中有类,父类,抽象类,接口这些概念,而设计模式的六大原则就解释了它们及其它们之间的关系是怎样的,接下来我们将由简到难一一剖析. 开闭原则:是总纲,他告诉我们要对扩展开放,对修改关闭. ...

  4. 设计模式的六大原则(SOLID)

    设计模式的六大原则有: Single Responsibility Principle:单一职责原则 Open Closed Principle:开闭原则 Liskov Substitution Pr ...

  5. unity 项目开发——浅谈设计模式的六大原则(一)

    目录 前言 首先,六大原则是谁? 其次,为什么需要学习这六大原则? 正文 一.单一职责原则 示例: 因此我们需要进行拆分,根据具体的职能可将其具体拆分如下: Unity 单一职责原则 二.开闭原则 U ...

  6. 设计模式的六大原则。简称:SOLID

    设计模式的六大原则.简称:SOLID 迪米特法则(Law of Demeter):如果两个类之间并不需要直接通信,那么就不应该让这两个类相互作用.又叫作最少知识原则 迪米特法则的定义是:只与你的直接朋 ...

  7. 「设计模式」六大原则之三:里氏替换原则小结

    文章目录 1.里式替换原则定义 2. 举例说明 示例1: 示例2: 3. 哪些代码明显违背了 LSP? 子类违背父类声明要实现的功能 子类违背父类对输入.输出.异常的约定 子类违背父类注释中所罗列的任 ...

  8. (转)设计模式之六大原则

    源地址:http://blog.csdn.net/scboyhj__/article/details/47844639 1. 单一职责原则 -Single Responsibility Princip ...

  9. 【设计模式】——六大原则

    ◎原则之间的关系◎ 开闭原则是目标,里氏转换原则是基础,依赖倒转原则是手段.六大原则追求的目标都是,可扩展,复用性强,灵活性高,容易维护,耦合度低. ★★单一职责原则★♬★ 定义:就一个类而言,应该仅 ...

  10. 何红辉设计模式之六大原则

    这篇文章总结的很到位: https://www.jianshu.com/p/807bc228dbc2 欢迎去阅读 设计模式六大原则 ,简称:solid 1.Single Responsibility ...

最新文章

  1. 毫米波雷达的市场格局及后续发展趋势
  2. 流利说统一可观察性平台实践
  3. boost::is_convertible相关的测试程序
  4. Leetcode 14.最长公共前缀
  5. 文件操作(解密加密)
  6. Android开发常用工具推荐
  7. mysql-安装包模式的安装过程-旧版
  8. 引物设计软件primer_常用生物学软件的安装与应用(三)—Primer6
  9. 在 Windows Server 2008 R2 下用 Visual Studio 2010 编译 Chrome 与 WebKit Chromium Port
  10. ubuntu 16.04 登录后黑屏
  11. AJAX异步实现简单的瀑布流
  12. 1177: 按要求排序(指针专题)_排序算法之快速排序
  13. C# Log4Net简单使用方法
  14. JS中Ajax的方法和应用
  15. 【毕业设计】基于Android的家校互动平台开发(内含完整代码和所有文档)——爱吖校推(你关注的,我们才推)...
  16. java根据距离算经纬度_java 根据两点经纬度来算距离
  17. GSM/GPRS之一-GSM基础知识
  18. 如何获取任意小程序的AppId和页面路径?
  19. D - The Lucky Week ZOJ - 3939 (思维)
  20. rtl8188linux内核配置,编译基于rtl8188cu控制芯片的USB无线网卡在Linux下的配置

热门文章

  1. 如何实现字符串的翻转,不用php库函数翻转字符串
  2. 20155308 《信息安全系统设计基础》课程总结
  3. gulp.js 的安装以及使用
  4. 把有限的精力放在最有意义的事上
  5. html表单验证元素必填,AngularJS表单验证:向用户指示必填字段
  6. gcc -ldl 选项作用
  7. DPDK uio驱动实现(二十)
  8. leetcode算法题--反转链表
  9. 前牙正常覆盖是多少_个性化舌侧矫治器的前牙转矩控制技巧——赵志河教授
  10. 几种常用的Java数据源解决方案