1.单一职责原则(SRP)

“单一职责模式”按照字面理解就是,一个类的功能要“单一”或者专一,不能武断地把很多相关或者不相关的功能强制写进一个类里去,它的准确解释是:“就一个类,应该仅有一个引起它变化的原因”。我个人认为这个原则主要就是教我们如何抽象并“封装”类。
举例:对于初学者来说,我们几乎都写过的代码,如webform和winform下用户进行登陆,webform的default.aspx.cs类和winform的form1.cs不用写一样的具体登陆业务逻辑,如数据库连接和查询,登陆账户和密码的匹配等等,而是应该抽象出用户类和一个登陆方法,然后winform或者webform共同调用该类的登陆方法就可以了。

2.开放-封闭原则(OC)

“对于扩展开放,对于更改封闭。”也就是“面对需求,对程序的改动是通过增加代码进行的,而不是更改现有的代码”。对于随时可能变化的需求,这个原则对于开发者而言实在是太重要了。在设计的时候,我们要尽量考虑种种变化,把问题考虑的尽量全面一些。但是,无论考虑的多么周到,无论你设计的模块多么“封闭”,都会存在一些无法对之封闭的变化。既然不太可能完全封闭,我们就必须对设计模块进行抽象,分离出变化点,以备将来“扩展”。我们都希望在开发工作展开之前或者开始不久就知道项目中可能的变化,这样遵循这个原则,抽象出变化点,程序的“可维护,可扩展,可复用和灵活性好”将大大增强。
举例:写计算器程序是一个经典的例子,开始要求写个加法运算,很快我们在客户端client写了出来。这个时候又要求写个减法运算,我们不得不更改client的类,这就违背了“对更改封闭”,所以我们最好抽象出一个抽象的运算类Operation,通过面向对象常见的继承和多态等特征来隔离具体加减乘除等方法与client的耦合,这样需求依然可以满足,还能应对变化。
3.里氏代换原则(LSP)
简单地说,也就是“子类型必须能够替换掉它们的父类型”。一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,而且它察觉不出父类对象和子类对象的区别。在程序中,把父类都替换成它的子类,程序的行为没有变化。
举例:在编程时,我们设计出一个鱼类(Fish),它的行为是”游“(Swim),接着是“金鱼(GoldFish)和木鱼(WoodenFish)”类,都继承鱼类,但是我们看到金鱼很显然可以“游”,但是木鱼只能被敲打而不能”游“,也就是说木鱼类不能继承鱼类。(这个例子也许不合适,听歌的时候想到的)
4.依赖倒转原则(DIP)

在解释这个原则前,我们先看看经常碰到的“依赖”,也就是耦合,耦合可以分为下面三种 :
(1)零耦合(Nil Coupling)关系,两个类没有依赖关系,那就是零耦合.
(2)具体耦合(Concrete Coupling)关系,两个具体的类之间有依赖关系,那么就是具体耦合关系,如果一个具体类直接引用另外一个具体类,就会发生这种关系.
(3)抽象耦合(Abstract Coupling)关系.这种关系发生在一个具体类和一个抽象类之间,这样就使必须发生关系的类之间保持最大的灵活性. (这也正是我们编程过程中最期望的耦合方式)
最经典最完美解释:“要针对接口编程,不要针对实现编程”。
依赖倒转原则:(1)高层模块不应该依赖底层模块。两个都应该依赖抽象。(2)抽象不应该依赖细节,细节应该依赖于抽象(Abstractions should not depend upon details. Details should depend upon abstractions)。“抽象”通常都是接口或者抽象类。这里重点是用到了面向对象里的“继承”特性。必须要注意:这个原则前提是里氏代换原则,在程序中,把父类替换成子类,程序的行为不会发生变化。只有当子类可以完全替换掉父类,父类才能真正被复用,而子类也能够在父类的基础上增加新的行为。
举例:还以webform的用户登陆为例,用户按照类别可以分成多种类型,比如普通注册用户,公司员工,不同等级的忠实用户,vip用户等等。我们抽象出一个抽象类User,这样让不同类别的员工继承User,普通用户和公司员工可能只有抽象类里的登陆方法,而不同等级的忠实用户和vip用户有扩展出一些自己独有的行为,如支付等等。这样通过父类User,要调用一个不同类别的用户就可以通过父类变量等于new一下具体类别的用户类就可以了。

5.迪米特法则(LoD)
又叫最少知识原则(Least Knowledge Principle 简写LKP)就是说,一个对象应当对其它对象有尽可能少的了解,也叫做“不要和陌生人说话”。它的正确解释是”如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。“。它强调我们在封装类的时候,在类的设计结构上,每一个类都应当降低成员的访问权限。类与类之间的耦合度越低越好,因为一个类被修改,不会对有关联的其他类也进行修改。

转载于:https://www.cnblogs.com/wubin264/archive/2009/04/11/1433713.html

设计模式的主要设计原则简介相关推荐

  1. IOS设计模式的六大设计原则之开放-关闭原则(OCP,Open-Close Principle)

    定义 一个软件实体(如类.模块.函数)应当对扩展开放,对修改关闭. 定义解读 在项目开发的时候,都不能指望需求是确定不变化的,大部分情况下,需求是变化的.那么如何应对需求变化的情况?这就是开放-关闭原 ...

  2. 设计模式之六大设计原则【入门】

    设计模式之六大设计原则 1 开闭原则 Open Closed Principle,OCP 1.1 概念 1.2 软件实体 1.3 开闭原则的作用 2. 单一职责原则 Single responsibi ...

  3. 设计模式01-七大设计原则

    设计模式01-七大设计原则 文章目录 设计模式01-七大设计原则 开闭原则-Open Close 依赖倒置原则-Dependence Inversion 单一职责原则-Simple ResponsiB ...

  4. 设计模式的六大设计原则

    设计模式的六大设计原则 1. 开闭原则 1.1 开闭原则:Open Closed Principle,OCP 1.2 开闭原则的作用 2. 单一责任原则 2.1 单一职责原则:Single respo ...

  5. 设计模式 — 6大设计原则(依赖倒置和接口隔离原则)

    设计模式 依赖倒置原则 示例 一 示例 二 依赖的三种写法 总结 接口隔离原则 实例 一 总结 依赖倒置原则 依赖倒置原则(Dependence Inversion Principle,DIP)这个名 ...

  6. 【设计模式】设计模式总结 ( 七大设计原则 | 创建型模式 | 结构型模式 | 行为型模式 ) ★★★

    文章目录 一.七大设计原则 1.开闭原则 2.依赖倒置原则 3.单一职责原则 4.接口隔离原则 5.迪米特原则 6.里氏替换原则 7.合成复用原则 二.创建型模式 0.简单工厂模式 ( 不属于 GOF ...

  7. 软件设计模式-7种设计原则总结

    7 种设计原则是软件设计模式必须尽量遵循的原则,各种原则要求的侧重点不同.其中,开闭原则是总纲,它告诉我们要对扩展开放,对修改关闭:里氏替换原则告诉我们不要破坏继承体系:依赖倒置原则告诉我们要面向接口 ...

  8. [Design]设计模式-- 为什么要学习设计原则/模式

    首先来考虑一款软件系统的生命周期.任何事物都要经历两次创造过程,软件项目系统也不例外.系统设计师拿到系统的设计需求后,首先系统存在于设计者们的头脑中,然后存在于设计图纸上,然后变成原型系统,最后变成真 ...

  9. [转] 设计模式的六大设计原则

    转载说明: 感谢原作者吕震宇老师的分享. 原文参考链接:https://www.cnblogs.com/zhenyulu/category/6930.html? 本次转载只用于个人学习使用,并不涉及商 ...

最新文章

  1. hihoCoder 网络流四·最小路径覆盖
  2. File-nodejs
  3. linux pssh parallel-ssh 批量执行远程shell命令
  4. 007_请求返回Json
  5. mysql文件系统_mysql文件系统先睹为快
  6. Linux shell脚本编程(二)
  7. [CQOI2015]任务查询系统
  8. 在辉腾锡勒我见到了狼
  9. Oracle入门(十四B)之PL/SQL异常处理
  10. 基于SpringBoot 2.0正式版的SpringCloud的微服务实战项目搭建
  11. 苹果mac os x系统的两种快捷截图技巧
  12. 【课本】【No.3】随机向量定义、联合分布函数、边缘分布、统计特征的分布函数的差分,独立性、离散型条件分布列,连续型分布函数与密度函数、随机向量的函数分布
  13. 一级计算机25套上网,全国计算机等级考试一级试题(25套)[1]
  14. oracle backup exec,通过Backup Exec实施Oracle灾难恢复
  15. XRD测试常见问题及解答(一)
  16. 两个表格数据合并怎么完成?
  17. 动手学强化学习(一):多臂老虎机 Multi-armed Bandit
  18. 行为型模式:备忘录模式
  19. 谷歌浏览器 如何设置在新标签页打开链接
  20. spring boot整合Quartz 在Job类中注入其他对象报空指针异常java.lang.NullPointerException at com.sxt.quartz.QuartzDemo.e

热门文章

  1. coreboot学习2:项目源码的初步了解
  2. tcpdump工具编译记录
  3. 【算法】二进制 与、或、异或运算
  4. 【Clickhouse】实时日志数据写入Clickhouse
  5. 【Java】Java 如何查看对象的内存布局
  6. 【Java】Arrays.asList 有坑
  7. 【MySQL】MySQL SQL查询语法建议
  8. 95-150-080-源码-Sink-StreamingFileSinkBucketingSink
  9. 【highlight】highlight 动态添加代码,样式失效
  10. 【Git】git 如何合并两个仓库(拉取A仓库的分支到B仓库)