1.单一职责原则

单一职责原则(Single Responsibility Principle)

含义:1.避免相同的职责分散到不同的类中,2.避免一个类承担太多的职责;
srp的好处:
减少类之间的耦合度
提高类的复用性

实际使用:

  1. 根据业务流程将业务对象抽离出来
  2. 注意职责的分类
单一职责原则的思想不仅应用于类中,在类的方法中,也应该有很好的体现;
也就是一个方法的逻辑不能过于复杂,而应该将不同的逻辑分离出来,最终简化方法的功能,提高代码的可读性;
例如,用户提交一个请求,我们需要对其参数进行简单的验证,那么这个验证的逻辑就可以分离出几个不同的方法来单独处理:
 
针对类方法设计原则:类的所有方法都是为了完成同职责,即高内聚;类之间的职责相互独立,减少依赖,即低耦合;减少了耦合性,提高了复用性;

2.接口隔离原则

接口隔离原则(Interface Segregation Principle ,缩写:ISP),客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。
使用多个专门的接口比使用单一的总接口要好。
 
一个类对另外一个类的依赖性应当是建立在最小的接口上的。
 
一个接口代表一个角色,不应当将不同的角色都交给一个接口。没有关系的接口合并在一起,形成一个臃肿的大接口,这是对角色和接口的污染。
 
“不应该强迫客户依赖于它们不用的方法。接口属于客户,不属于它所在的类层次结构。”;再通俗点讲,不要强迫客户使用她们不用的方法,如果强迫用户使用她们不使用的方法,那么这些客户就会面临由于这些不使用的方法的改变所带来的改变。
 
核心思想:接口既要拆,也不能拆的太细,应该具备一些基本功能,能独一完成一个基本的任务,即高内聚;是针对接口设计的原则

3.开放-封闭原则

开闭原则(Open Close Principle,缩写:OCP),软件中的对象(类、模块、函数等)应该对于扩展是“开放”的,但是对于修改是“封闭”的。通俗点讲就是软件系统中包含的各种组件应该在不修改现有代码的基础上引入新功能。“开”是对于组件功能的扩展是开放的,
是允许对其进行功能扩展的;“闭”是对于原有代码的修改是封闭的,即不应该修改原有代码。 特征:
让程序更稳定、更灵活:
 
1.对于扩展是开放的:当应用的需求改变时,我们可以对模块进行扩展,使其具有满足那些改变的新行为。也就是说,我们可以改变模块的功能。
2.对于修改是封闭的:对模块行为进行扩展时,不必改动模块的源代码或者二进制码。
 
核心思想:是对抽象编程,而不是具体编程,因为抽象相对稳定。让类依赖于固定的抽象,这样的修改就是封闭的;通过对象的继承和多态机制,可以实现对象的继承,通过覆写其方法来改变固有行为,实现新的扩展方法,即对扩展是开放的。
针对抽象,实现设计原则;

4.替换原则

里氏替换原则(Liskov Substitution Principle ,缩写:LSP),原则说任何基类可以出现的地方,子类一定可以出现。LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能在基类的基础上增加新的行为。
里氏替换原则的核心原理是抽象,抽象又依赖于继承这个特性,在OOP中,继承的优缺点相当明显,主要有以下几点
 
优点:1.代码重用,减少创建类的成本,每个子类都拥有父类的方法和属性;2.子类与父类基本相似,但又与父类有所区别;3.提高代码的可扩展性。
缺点:1.继承是侵入性的,只要继承就必须拥有父类的所有属性和方法;2.可能造成子类代码冗余、灵活性降低,因为子类必须拥有父类的属性和方法。
 
LSP:它主要是针对继承的设计原则

5.依赖倒置原则

依赖倒置原则(Dependence Inversion Principle ,缩写:DIP),是程序要依赖于抽象接口,不要依赖于具体实现。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。

原则

1.高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。上层模块不应该依赖于下层模块,他们共同依赖于一个抽象(父类不能依赖于子类,他们都要依赖于抽象类)

2.抽象不应该依赖于具体实现,具体实现应该依赖于抽象。

针对抽象和实现设计原则:

6.最少知识原则

迪米特原则(Law of Demeter ,缩写:LoD),又叫作最少知识原则(Least Knowledge Principle,简写LKP),就是说一个对象应当对其他对象有尽可能少的了解。
原则
 
一个类应该对自己需要耦合或调用的类知道的最少,类的内部如何实现与调用者或者依赖者没关系,调用者或者依赖者只需要知道它需要的方法即可,其他的可一概不用管。类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大。
 
迪米特法则可以简单说成:talk only to your immediate friends.也就是“只与直接的朋友通信”。至于什么是直接的朋友?每个对象都必然会与其它对象有耦合关系,两个对象之间的耦合就成为朋友关系,这种关系的类型有很多,如组合、聚合、依赖等
 
针对类的封装设计原则

php的设计模式的更多相关文章

  1. MVVM设计模式和WPF中的实现(四)事件绑定

    MVVM设计模式和在WPF中的实现(四) 事件绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

  2. java EE设计模式简介

    1.何为设计模式 设计模式提供了对常见应用设计问题的解决方案.在面向对象的编程中,设计模式通常在解决与对象创建和交互相关的问题,而非整体软件架构所面对的大规模问题,它们以样板代码的形式提供了通用的解决 ...

  3. 计算机程序的思维逻辑 (54) - 剖析Collections - 设计模式

    上节我们提到,类Collections中大概有两类功能,第一类是对容器接口对象进行操作,第二类是返回一个容器接口对象,上节我们介绍了第一类,本节我们介绍第二类. 第二类方法大概可以分为两组: 接受其他 ...

  4. 《JavaScript设计模式 张》整理

    最近在研读另外一本关于设计模式的书<JavaScript设计模式>,这本书中描述了更多的设计模式. 一.创建型设计模式 包括简单工厂.工厂方法.抽象工厂.建造者.原型和单例模式. 1)简单 ...

  5. 《JavaScript设计模式与开发实践》整理

    最近在研读一本书<JavaScript设计模式与开发实践>,进阶用的. 一.高阶函数 高阶函数是指至少满足下列条件之一的函数. 1. 函数可以作为参数被传递. 2. 函数可以作为返回值输出 ...

  6. 设计模式之行为类模式大PK

                                        行为类模式大PK 行为类模式包括责任链模式.命令模式.解释器模式.迭代器模式.中介者模式.备忘录模式.观察者模式.状态模式.策略 ...

  7. .NET设计模式访问者模式

    一.访问者模式的定义: 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 二.访问者模式的结构和角色: 1.Visitor 抽象访问者角色,为该 ...

  8. Java开发中的23种设计模式详解

    [放弃了原文访问者模式的Demo,自己写了一个新使用场景的Demo,加上了自己的理解] [源码地址:https://github.com/leon66666/DesignPattern] 一.设计模式 ...

  9. java 设计模式

    目录: 设计模式六大原则(1):单一职责原则 设计模式六大原则(2):里氏替换原则 设计模式六大原则(3):依赖倒置原则 设计模式六大原则(4):接口隔离原则 设计模式六大原则(5):迪米特法则 设计 ...

  10. 设计模式之单例模式(Singleton)

    设计模式之单例模式(Singleton) 设计模式是前辈的一些经验总结之后的精髓,学习设计模式可以针对不同的问题给出更加优雅的解答 单例模式可分为俩种:懒汉模式和饿汉模式.俩种模式分别有不同的优势和缺 ...

随机推荐

  1. BZOJ4650:[NOI2016]优秀的拆分——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4650 https://www.luogu.org/problemnew/show/P1117 如果 ...

  2. [Leetcode] restore ip address 存储IP地址

    Given a string containing only digits, restore it by returning all possible valid IP address combina ...

  3. 从零开始学Linux系统(四)之Vi/Vim操作指令

    模式切换: 编辑模式 <-- [:]<--命令模式 -->[a.i.o A.I.O]-->  插入模式 编辑模式操作: 设置行号  :set nu   :set nonu 复制 ...

  4. apache和IIS共享80端口解决办法

    第一步:把iis所发布的网站默认端口由80改为8080:第二步:修改apache的httpd.conf配置文件. 首先,要让apache支持转发也就是做iis的代理那么就要先启 用apache的代理模 ...

  5. c++ linux 判断string是中文的 or 英文的 字符串。

    #include <iostream> #include <string.h> #include <stdio.h> #include <stdlib.h&g ...

  6. android 自定义控件---圆形方向盘

    在做Android平台开发的时候,经常会遇到安卓原生控件无法满足需求的情况,安卓允许开发者去继承已经存在的控件或者实现你自己的控件. 先来看一下效果图 采用直接集成View类,重写onDrow方法绘制 ...

  7. JS 中类型鉴别

    JS中的基本类型有:数字(Number(NaN,Infinity)),字符串(String),Undefined,Null,Boolean 引用类型有:数组(Array),对象(Object),函数( ...

  8. 手脱ASProtect v1.2(无Stolen Code)

    1.载入PEID ASProtect v1.2 2.载入OD > 01C04200 push 跑跑赛道.0042C001 ; //入口处 C3 retn AA stos byte ptr es: ...

  9. 阿里C++研发实习二面和三面面经

    下午连着面了阿里爸爸的二面和三面,非常不明白别人的三面都是hr了,为什么我还是在技术面,难道面了个假阿里.不管怎么样,来篇面经攒攒人品. 二面 第一次遇到这么严肃的面试官,居然可以全程无表情的,面了这 ...

  10. sql生成一个日期表

    SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- Auth ...