声明:本系列博客参考资料《大话设计模式》,作者程杰。

一般认为遵从以下六大原则的代码是易扩展可复用的代码:

这六大原则任何面向对象的语言都应该遵守的,要想让你的代码易扩展高服用就尽量去满足这六大原则吧,不一定严格按照某种设计模式,但是如果你的代码符合这六大原则,那么你的代码就是好代码了,好的代码不一定是严格按照设计模式写的代码。

1.单一职责

定义:不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。

场景:类T负责两个不同的职责:职责P1,职责P2。当由于职责P1需求发生改变而需要修改类T时,有可能会导致原本运行正常的职责P2功能发生故障,关系如下图:

修改:遵循单一职责原则。分别建立两个类T1、T2,使T1完成职责P1功能,T2完成职责P2功能。这样,当修改类T1时,不会使职责P2发生故障风险;同理,当修改T2时,也不会使职责P1发生故障风险,结构如下图:

优点:

1)、可以降低类的复杂度,一个类只负责一项职责,逻辑简单;

2)、提高类的可读性,提高系统的可维护性;

3)、变更引起的风险降低,变更是必然的。

2.里氏代换原则

定义:所有引用基类的地方必须能透明地使用其子类的对象,也就是说子类可以扩展父类的功能,但不能改变父类原有的功能

场景:有一功能P1,由类A完成。现需要将功能P1进行扩展,扩展后的功能为P,其中P由原有功能P1与新功能P2组成。新功能P由类A的子类B来完成,则子类B在完成新功能P2的同时,有可能会导致原有功能P1发生故障,如下图:

CountPriceByJKL类继承于CountPrice类,CountPriceByJKL重写了Count()方法,这样可能影响到原来Count方法的功能。

修改:当使用继承时,遵循里氏替换原则。类B继承类A时,除添加新的方法完成新增功能P2外,尽量不要重写父类A的方法,也尽量不要重载父类A的方法。

3.依赖倒置原则

定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。

此处理解起来是最困难的,一般会在项目框架的搭建的时候用到,例如,业务逻辑层相对于数据层是高层模块,因为业务逻辑层需要调用数据层去连接数据库,但是要做到可扩展高复用,尽量不要让业务逻辑层依赖数据层,可以在数据层抽象出一个接口,让业务逻辑层依赖于这个抽象接口。

场景:类A(高层模块)直接依赖类B(低层模块),假如要将类A改为依赖类C(低层模块),则必须通过修改类A的代码来达成。这种场景下,类A一般是高层模块,负责复杂的业务逻辑;类B和类C是低层模块,负责基本的原子操作;假如修改类A,会给程序带来不必要的风险。

AutoSystem类直接依赖于HondaCar与FordCar两个类,这样就产生了一个高耦合,AutoSystem类想操控HondaCar或者FordCar必须直接创建相应对象。

修改:将类A修改为依赖接口I,类B和类C各自实现接口I,类A通过接口I间接与类B或者类C发生联系,则会大大降低修改类A的几率,如下图:

经过此番修改,Honda与Ford实现ICar接口,提供了Run、Stop以及Turn功能方法,AutoSystem依赖ICar接口,这样迫使AutoSystem依赖抽象接口,这就使得AutoSystem类能够应对更多的需求变化。

优点:

1)、低层模块尽量都要有抽象类或接口,或者两者都有。

2)、变量的声明类型尽量是抽象类或接口。

3)、使用继承时遵循里氏替换原则。

4.接口隔离原则

定义:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。

场景:类A通过接口I依赖类B,类C通过接口I依赖类D,如果接口I对于类A和类B来说不是最小接口,则类B和类D必须去实现他们不需要的方法,如下图:

        

   修改:将臃肿的接口I拆分为独立的几个接口,类A和类C分别与他们需要的接口建立依赖关系。也就是采用接口隔离原则。

        

   注意:

     1)、接口尽量小,但是要有限度。对接口进行细化可以提高程序设计灵活性   是不挣的事实,但是如果过小,则会造成接口数量过多,使设计复杂化。所以一定要适度。

     2)、为依赖接口的类定制服务,只暴露给调用的类它需要的方法,它不需要的方法则隐藏起来。只有专注地为一个模块提供定制服务,才能建立最小的依赖关系。

    3)、提高内聚,减少对外交互。使接口用最少的方法去完成最多的事情。

    5.迪米特法则(最少知道原则)

  定义:一个对象应该对其他对象保持最少的了解。

  场景:类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大。

  简单的理解就是高内聚,一个类尽量减少对其他对象的依赖,并且这个类的方法和属性能用私有的就尽量私有化。

  注意:

1)、只与直接的朋友通信,不要和陌生人说话。

2)、过分的使用该原则,将导致系统复杂度变大。所以在采用迪米特法则时要反复权衡,既做到结构清晰,又要高内聚低耦合。

6.开闭原则

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

场景:在软件的生命周期内,因为变化、升级和维护等原因需要对软件原有代码进行修改时,可能会给旧代码中引入错误,也可能会使我们不得不对整个功能进行重构,并且需要原有代码经过重新测试。

建议:当软件需求变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。

更多详情敬请关注我的视频课程:

PHP面向对象设计模式

PHP设计模式——六大原则相关推荐

  1. PHP 设计模式六大原则

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

  2. Java 设计模式六大原则

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

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

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

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

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

  5. 设计模式六大原则——合成/聚合复用原则(CARP)

    1.定义 简而言之,对于合成/聚合复用原则的定义就是:要尽量使用合成和聚合,尽量不要使用继承. 2.释义 为什么"要尽量使用合成和聚合,尽量不要使用继承"呢? 这是因为: 第一,继 ...

  6. 五分钟了解设计模式六大原则(上)

    目录 简介 设计模式是什么? 设计模式六大原则是什么? 设计模式有哪些? 单一职责原则(Single Responsibility Principle) 我们应该如何使用单一职责呢? 里氏替换原则(L ...

  7. 设计模式六大原则之--开闭原则(OCP)

    设计模式六大原则之--开闭原则(OCP) 前言 1 描述 2 理解: 3 问题由来: 4 使用LoD的好处: 5 难点: 6 最佳实践: 7 范例: 前言 The Open - Closed Prin ...

  8. 设计模式六大原则之里氏替换原则、依赖倒置原则详解

    设计模式六大原则--里氏替换原则.依赖倒置原则详解 1.里氏代换原则(Liskov Substitution Principle) 概念 顾名思义,该原则用于经常发生替换的地方,在Java中指的是实现 ...

  9. 设计模式六大原则及常用模式详解

    设计模式六大原则 1.单一职责原则(Single Responsibility Principle) 定义 : 应该有且只有一个原因引起类的变化 注意 : 这里的类不光指类,也适用于方法和接口,比如我 ...

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

    设计模式六大原则(SOLID) Single Responsibility Principle:单一职责原则 Open Closed Principle:开闭原则 Liskov Substitutio ...

最新文章

  1. Thread和Object类中关于线程的相关方法
  2. Two Sum [easy] (Python)
  3. Reboot与init 6的区别
  4. mysql 透明代理_透明代理MySQL_基于zbus的MySQL透明代理(100行)-云栖社区
  5. BM39 序列化二叉树
  6. ALSA声卡12_从零编写之添加音量控制_学习笔记
  7. 1.1.0-简介-P11-分布式锁的解决方案
  8. gentoo/funtoo 环境配置使用 valgrind
  9. oracle数据块dump信息,从数据块的dump信息能看出什么
  10. EJB3.0学习笔记---MDB--第一个MDBBean程序:
  11. mysql workbench企业_甲骨文发布MySQL Workbench 6.0版本
  12. R语言学习笔记 | R语言的入门
  13. OC语言基础十:OC文件操作
  14. Excel如何将英语大写快速转变为小写
  15. 用大数据文本挖掘来看“共享单车”的行业现状及走势
  16. 清华大学计算机系2016名单,2016年本科生表彰名单
  17. 取消Excel里面全部超级链接
  18. 门禁管理系统(Swing/Dos)
  19. pscc改变图片字体大小
  20. Crack:Stimulsoft BI Server 2022.4.5

热门文章

  1. c语言libjpeg处理图像,解决使用 libjpeg 保存图片时因磁盘写入失败导致程序退出的有关问题...
  2. rename python_谈谈重命名方法renames详解
  3. JAVA 中 Redis与ehcache对比与使用
  4. channelinboundhandler中都包含了哪一类的方法_标准气体的分类类别与相关气体配置方式方法...
  5. python3小游戏源代码_Python入门塔防小游戏,开发步骤和源码,带你轻松学python...
  6. c语言if怎么结束_07if与循环案例超经典C语言
  7. java se 6 mac_Mac OS X “打开xx软件, 你需要一个Java SE 6运行环境”问题解决
  8. emui内核支持kvm吗_Linux专题—使用kvm搭建虚拟机
  9. 【C++入门】C++ 继承和派生
  10. Hive导入csv文件