设计模式之六大设计原则(一)

6大设计原则

 

  • 单一职责原则
  • 里氏替换原则
  • 依赖倒置原则
  • 接口隔离原则
  • 迪米特法则
  • 开闭原则

 

1 单一职责原则(Single Responsibility Principle)

     单一职责,简称SRP。单一职责的定义是:应该有且仅有一个原因引起类的改变。单一职责最难划分的就是职责,一个职责一个接口,但是职责的划分因项目而异。对于接口,我们在设计的时候一定要做到单一,但是对于实现类尽量做到只有一个原因引起变化。实现类生搬硬套单一职责会引起类的剧增。

 

2 里氏替换原则(Liskov Substitution Principle)

     里氏替换原则,简称LSP。通俗来讲,只要父类能出现的地方子类就能出现,而且替换为子类也不会产生任何错误或异常,使用者可能根本不需要知道是父类还是子类。但是有子类出现的地方,父类未必能适应。

     里氏替换原则包含四重含义:

  1) 子类必须完全实现父类的方法。在类中调用其他类时务必使用父类或借口,如果不能使用父类或借口,则说明违背了LSP原则。

  2) 子类可以有自己的个性。

  3) 覆盖或实现父类的方法时参数可以被放大。里氏替换原则要求制定一个契约,就是父类或者借口,这种设计方法也叫做Design by Contract (契约设计),与里氏替换原则有着异曲同工之妙。子类中方法的前置条件必须与超类中被覆写的方法的前置条件相同或者更宽松。

  4) 覆写或实现父类的方法时输出结果可以被缩小。

3 依赖倒置原则(Dependence Inversion Principle)

     依赖倒置原则,简称DIP。其含义为:高层模块不应依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。更加精简的定义就是“面向接口编程”

两个类之间有依赖关系,只要制定出两者之间的接口(或抽象类)就可以独立开发了,而且项目之间的单元测试也可以独立得运行,而TDD (Test-Driven Development,测试驱动开发) 开发模式就是依赖倒置原则的最高级应用。

     抽象是对实现的约束,对依赖者而言,也是一种契约。不仅约束自己,还同时约束自己与外部的关系,其目的是保证所有的细节不脱离契约的范畴,确保约束双方按照既定的契约(抽象)共同发展。

     依赖传递的三种方法:

  1) 构造函数传递以来对象。在类中通过构造函数声明依赖对象,按照依赖注入的说法这种方式叫做构造函数注入。

  2) Setter方法传递依赖对象。在抽象中设置Setter方法声明依赖关系,也可称为Setter依赖注入。

  3) 接口声明依赖对象,也称为接口注入。

     依赖倒置原则的本质就是通过抽象(接口或者抽象类)使各个类或模块的实现彼此独立,不相互影响,实现模块间的松耦合。我们可以遵循以下规则:每个类尽量有接口或者抽象类,或者两者都具备;变量的声明类型尽量是接口或者抽象类;任何类都不应从具体类派生;尽量不要覆写基类方法;结合里氏替换原则可以得到如下规则:接口负责定义public属性和方法,并且声明与其他对象的依赖关系,抽象类负责公共构造部分的实现,实现类准确地实现业务逻辑,同时在适当的时候对父类进行细化。

 

4 接口隔离原则(Interface Segregation Principle)

     接口隔离原则,其含义为:客户端应该依赖它需要的接口,仅提供需要的接口,剔除不需要的,细化需要的接口,保证其纯洁性。接口中的方法应该尽量少。

单一职责要求的是类和接口职责单一,注重的是职责,这是逻辑业务上的划分,而接口隔离原则要求接口方法尽量少。

保证接口的纯洁性要求

  1) 接口尽量小。根据接口隔离原则拆分接口时,首先必须满足单一职责原则。

  2) 接口要高内聚。在接口中尽量少公布public方法,接口是对外的承诺,承诺越少对开发越有利,变更风险越小,同时有利于降低成本。

  3) 定制服务。单独为一个个体提供优良的服务,只提供访问者需要的方法。

  4) 接口设计是有限度的。接口设计的粒度要适度。

 

5 迪米特法则(Law of Demeter)

     迪米特法则,简称LoD,也被称为最少知识原则(Least Knowledge Principle,LKP)。一个类应该对自己耦合或调用的类知道得最少。

     迪米特法则要求尽量不要对外公布太多的public方法和非静态的public方法,多使用private、package-private、protected等访问权限。

     如果一个方法放在本类中,既不增加类间关系,也不对本类产生负面影响,那么就放置在本类中。

     迪米特法则的核心就是类间解耦,弱耦合。只有弱耦合以后,类的复用率才能提高。其要求的结果就是产生大量的中转或者跳转类,导致系统的复杂度提高,同时也为维护带来难度。

 

6 开闭原则(Open Closed Principle)

     开闭原则:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。

     开闭原则对扩展开放,对修改关闭,并不意味着不做任何修改,低层模块修改必然有高层模块耦合,否则就是一段无意义的代码。

     变化可以归纳为三种类型:

  1) 逻辑变化。只变化一个逻辑,而不涉及其他模块,可以通过修改原有类中的方法来实现。前提条件是所有依赖或者关联类都按照相同的逻辑处理。

  2) 子模块变化。低层次模块的变化必然引起高层次模块的变化。因此在通过扩展完成变化时,高层次的模块修改是必然的。

  3) 可见视图的变化。

     如何使用开闭原则:

  1) 抽象约束。通过接口或抽象类可以约束一组可能变化的行为,并且能够实现开放。其包含三层含义:第一,通过接口和抽象类对扩展进行边界的限定,不允许出现在接口或抽象类中不存在的public方法;第二,参数类型、引用对象尽量使用接口或者抽象类而不是实现类;第三,抽象层保持稳定,一旦确定就不允许修改。

  2) 元数据(metadata)控制模块行为。

  3) 制定项目章程。

  4) 封装变化。

时间: 2024-10-13 02:54:25

设计模式之六大设计原则(一)的相关文章

设计模式之六大设计原则

在上篇博文中提到了开放-封闭原则,没有细谈,这次我们来总结一下设计模式的几大原则. 1开放-封闭原则:是指软件实体(类.模块.函数等)应该可以扩展,但是不可修改. 对原则的理解:开闭原则是最具有理想主义色彩的一个原则,它是面向对象设计的终极目标,下面所要介绍的几个原则可以看成是为了符合开闭原则所作的努力和解决办法.对于开闭原则通俗的理解就是,能不改就不改,能少改尽可能的少改.周所周知,物质是运动的,世界是变化的,想要让一个事物永恒不变是不可能的,所以要想让软件绝对符合开闭原则是不可能的. 2单一

设计模式小结——六大设计原则

设计模式是一套由软件界前辈们总结出的可以反复使用的编程经验,旨在提高代码的可重用性,提高系统的可维护性,以及解决一系列复杂问题.设计模式包括6大设计原则和23种种设计模式.6大设计原则:单一职责原则SRP 应该有却仅有一个原因引起类的变更,即类最好只实现一种功能.高内聚. 单一职责的实现方式是一个职责一个接口. 单一职责适用于类和接口,同样适用于方法,一个方法也应该只做好一件事.里氏替换原则LSP 所有能使用父类的地方必须能透明地使用其子类的对象. 子类必须完全实现父类的方法,如果子类不能完整实

C#设计模式:六大设计原则

面向对象的典型原则 可以划分两类:面向类的和面向包. 面向类的包括: SRP--单一职责原则. OCP--开放封闭原则. LSP --里氏替换原则. DIP--依赖倒置原则. ISP--接口隔离原则. 面向包的包括: 强调的是包的内聚性设计要求->REP--重用发布等价原则. CCP--共同封闭原则. CRP--共同重用原则. 针对是包间耦合性要求->ADP--无环依赖原则. SPP--稳定依赖原则. SAP--稳定抽象原则. 六大设计原则: 单一职责原则 SRP-- Single Respo

php设计模式之六大设计原则

  1.单一职责 定义:不要存在多于一个导致类变更的原因.通俗的说,即一个类只负责一项职责. 场景:类T负责两个不同的职责:职责P1,职责P2.当由于职责P1需求发生改变而需要修改类T时,有可能会导致原本运行正常的职责P2功能发生故障. 修改:遵循单一职责原则.分别建立两个类T1.T2,使T1完成职责P1功能,T2完成职责P2功能.这样,当修改类T1时,不会使职责P2发生故障风险:同理,当修改T2时,也不会使职责P1发生故障风险. 优点: 1).可以降低类的复杂度,一个类只负责一项职责,逻辑简单

设计模式中的六大设计原则之三,四

求二叉树的宽度和深度 给定一个二叉树,获取该二叉树的宽度和深度. 例如输入 a / \ b c / \ / \ d e f g 返回3. 详细描述: 接口说明 原型: int GetBiNodeInfo(BiNode &head, unsigned int *pulWidth, unsigned int *pulHeight) 输入参数: head 需要获取深度的二叉树头结点 输出参数(指针指向的内存区域保证有效): pulWidth 宽度 pulHeight 高度 返回值: 0 成功 1 失败

设计模式中的六大设计原则之一,二

最近在学习设计模式方面的知识,首先接触到的是设计模式中的六大设计原则: 1.单一职责原则: 2.里氏替换原则:3.依赖倒置原则:4.接口隔离原则:5.迪米特法则:开闭原则.下面我来讲讲我对这六大设计自己的理解,如有欠缺地地方,请大家及时指出啊...   1.单一职责原则:应该有且仅有一个原因引起类的变更.通俗的说,即一个类只负责一项职责.下面我们举一个具体的例子来说明一下什么是单一职责原则.电话通话的时候有4个过程发生:拨号,通话,回应,挂机,首先看下面这样一个借口,如图1所示: 图1. 我们来

了解设计模式先从六大设计原则说起

了解设计模式的朋友们,想必都听说过"六大设计原则"吧.其实最经典的 23 种设计模式中或多或少地都在使用这些设计原则,也就是说,设计模式是站在设计原则的基础之上的.所以在学习设计模式之前,很有必要对这些设计原则先做一下了解. GoF(四人帮),传说中的四位大神们,他们联手搞出了一套设计模式,堪称 OOD(面向对象设计)的经典之作!震惊了整个软件开发领域.但这四个老家伙非常怪异,总是喜欢显摆一些高深的理论,甚至有时候不说人话,十分让人费解. 除了最经典的六大设计原则以外,还有一些其他的设

[设计模式]之零:六大设计原则

设计模式系列目录 单一职责原则 Single Responsibility Principle - SRP 就一个类而言,应该仅有一个引起它变化的原因. 假设现在要在iPhone上做一个图片编辑工具.功能有裁剪图片,旋转图片,缩放移动照片等等. 呐,我们可以写一个功能集类,然后把这些所有操作视为功能集的一部分,把代码全部写进这个类里面. 这么看来似乎可以,因为这是作为一个单独的模块嘛,把相关功能写进一个工具类里,用哪个功能调用哪个函数就好了.但这带来了一个问题就是这个工具类包含过多功能显得非常臃

浅谈Java六大设计原则

笔者刚接触设计原则的时候,觉得一头雾水,不知道他有什么用.在经历了一段时间的代码加上了解Java设计模式之后.笔者忽然觉得自己以前写的代码就是一堆*.所以,笔者认为设计原则和设计模式对于软件编程设计(非码农)来说是至关重要的事情.相信很多学习编程的人,和我有同样的感受. 我对设计模式和设计原则的理解是:如果把程序员比作武侠,那么设计模式就是修炼内功的易筋经,设计原则就是修炼内功的心法总纲,而具体的技术实现(代码编写)就是罗汉拳.如果你只想自保,那么会罗汉拳就可以了(能够用代码实现功能),不过如果