PHP23种设计模式之序言
一、什么是设计模式
百度百科:设计模式(Designpattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
目的:使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。
设计模式简述:每一个模式对应着不同的应用场景,解决不同的问题。设计模式有诸多好处(如“目的”所说),但不能乱用设计模式,
每一个设计模式都有其优缺点,如果乱用设计模式而忽略它的缺点,用的不好,那么就是灾难,最好的办法就是根据环境来使用正确的设计模式。拿单例模式来说,如明不使用设计模式的话,那么每new一次,就会实例出一个对象来,这就会增加内存的开销,当达到一定的量时,那结果就是恐怖的。使用单例模式,无论new多少个实例对象,其结果都只有一个实例对象。
二、设置模式类型
一说设计模式,首先会说23种设计模式,设计模式远不止23种。通常将设计模式分为创建型模式(CreationalPatterns)、结构型模式(StructuralPatterns)、行为型模式(BehavioralPatterns)三大类。
创建型模式(5个):对象实例化的模式,创建型模式用于解耦对象的实例化过程。
单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式
结构型模式(7个):把类或对象结合在一起形成一个更大的结构。
适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式、代理模式
行为型模式(11个):类和对象如何交互,及划分责任和算法。
访问者模式、模板模式、策略模式、状态模式、观察者模式、备忘录模式、中介者模式、迭代器模式、解释器模式、命令模式、责任链模式
三、设计模式七大原则
高内聚、低耦合、多复用
1)单一职责原则(SingleResponsibilityPrinciple)
含义:一个类只负责一项职责。解释:一个类如果负责两个不同的职责,当其一个一个职责发生变更而改变类时,可能会造成另外一个职责执行错误,因此需要将两个职责分开。
目的:降低代码复杂度、系统解耦合、提高代码可读性。
2)开闭原则(OpenClosePrinciple)
含义:对扩展开放,对修改封闭。简而言之,当需求发生变更时,不去修改代码,而是在此基础上进行扩展。
目的:提高扩展性、便于维护。
3)里氏代换原则(LiskovSubstitutionPrinciple)
含义:里氏代换原则是面向对象设计的基本原则之一。里氏代换原则中说,一个可以接受基类对象的地方必然可以接受一个子类对象。如:程序设计中尽量把父类设计为抽象类或者接口,让子类继承父类或实现父接口,子类可以扩展父类的功能,但不能改变父类原有的功能。
解释:父类能做的事,子类都能做;子类能做的事,父类不一定能做。
目的:避免系统继承体系被破坏
4)依赖倒转原则(DependenceInversionPrinciple)
含义:要针对抽象层编程,而不要针对具体类编程。
4.1)高层模块不应该依赖低层模块,二者都应该依赖其抽象
4.2)抽象不应该依赖细节,细节应该依赖抽象
4.3)依赖倒转(倒置)的中心思想是面向接口编程
4.4)依赖倒转原则是基于这样的设计理念:相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建的架构比以细节为基础的架构要稳定的多。在java中,抽象指的是接口或抽象类,细节就是具体的实现类。
4.5)使用接口或抽象类的目的是制定好规范,而不涉及任何具体的操作,把展现细节的任务交给他们的实现类去完成。
目的:避免需求变化导致过多的维护工作
5)接口隔离原则(InterfaceSegregationPrinciple)
含义:使用多个专门的接口来取代一个统一的接口。
目的:避免接口过于臃肿
6)迪米特法则(DemeterPrinciple)
含义:一个软件实体对其他实体的引用越少越好,或者说如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用,而是通过引入一个第三者发生间接交互。
目的:降低类与类之间的耦合
7)合成复用原则(CompositeReusePrinciple)
含义:当要扩展类的功能时,优先考虑使用合成/聚合,而不是继承。
目的:防止类的体系庞大
关于自如初个人博客设计模式的说明:
1)关于设计模式这一块内容的文章,皆是根据书籍、网络资料学习而来,然后根据自己的理解所写;
2)关于设计模式理论知识,由于未能想出更好的案例和对一些模式的理解不够深入,有的理论知识则来自其他博客,如“序言”中的理论知识,大都来自于网络;
3)关于设计模式,是个人在学习中所写而记录,主要用于日后的温故;
4)若所有不足,还望指出,欢迎一起交流学习;
5)随着学习的深入与理解,后续将会对本块内容进行重新修正与编写记录。
我是夕阳何处寻,期待和优秀的你一起同行!
夕阳何处寻
2019年12月17日