# 设计模式的PHP实现 **Repository Path**: zayata/design-patterns ## Basic Information - **Project Name**: 设计模式的PHP实现 - **Description**: No description available - **Primary Language**: PHP - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 2 - **Created**: 2021-10-19 - **Last Updated**: 2021-10-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 设计模式的PHP实现 ### 概念 #### 区分层次结构 * 架构模式 软件设计中的高层决策,例如C/S结构就属于架构模式,架构模式反映了开发软件系统过程中所做的基本设计决策。 * 设计模式 设计模式是面向对象的最佳实践。 每一个设计模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样你就能一次又一次地使用该方案而不必做重复劳动。设计模式的核心在于提供了相关问题的解决方案,使得人们可以更加简单方便地复用成功的设计和体系结构。 四个基本要素:模式名称、问题(应该在何时使用模式)、解决方案(设计的内容)、效果(模式应用的效果)。 * 惯用法 最低层的模式,关注软件系统的设计与实现,实现时通过某种特定的程序设计语言来描述构件与构件之间的关系。每种编程语言都有它自己特定的模式,即语言的惯用法。例如引用一计数就是C++语言中的一种惯用法。 #### 设计模式分类和关系 根据设计模式的参考书 Design Patterns - Elements of Reusable Object-Oriented Software(中文译名:设计模式 - 可复用的面向对象软件元素) 中所提到的,总共有 23 种设计模式。 这些模式可以分为三大类:创建型模式(Creational Patterns)、结构型模式(Structural Patterns)、行为型模式(Behavioral Patterns)。 当然,我们还会讨论另一类设计模式:J2EE 设计模式。 ![23 种设计模式分类](schema.png) ![设计模式之间的关系](the-relationship-between-design-patterns.jpg) #### 设计模式的六大原则 1. 开闭原则(Open Close Principle) 开闭原则的意思是:对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。 2. 里氏代换原则(Liskov Substitution Principle) 里氏代换原则是面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。LSP 是继承复用的基石,只有当派生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用,而派生类也能够在基类的基础上增加新的行为。里氏代换原则是对开闭原则的补充。实现开闭原则的关键步骤就是抽象化,而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。 3. 依赖倒转原则(Dependence Inversion Principle) 这个原则是开闭原则的基础,具体内容:针对接口编程,依赖于抽象而不依赖于具体。 4. 接口隔离原则(Interface Segregation Principle) 这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。它还有另外一个意思是:降低类之间的耦合度。由此可见,其实设计模式就是从大型软件架构出发、便于升级和维护的软件设计思想,它强调降低依赖,降低耦合。 5. 迪米特法则,又称最少知道原则(Demeter Principle) 最少知道原则是指:一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。 6. 合成复用原则(Composite Reuse Principle) 合成复用原则是指:尽量使用合成/聚合的方式,而不是使用继承。 ### 实战 #### PHP 实战创建型模式(5种) 这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。 * [单例模式 Singleton](https://e.gitee.com/xmzm/repos/xmzm/design-patterns/tree/master/singleton) > 关键词:唯一实例 > > 保证一个类只有一个实例,并提供一个访问它的全局访问点。 * [工厂方法模式 Factory Method](https://e.gitee.com/xmzm/repos/xmzm/design-patterns/tree/master/factory) > 关键词:子类决定实例化 > > 定义一个创建对象的接口,但由子类决定需要实例化哪一个类,使得子类实例化过程推迟。 * [抽象工厂模式 Abstract Factory](https://e.gitee.com/xmzm/repos/xmzm/design-patterns/tree/master/factoryAbstract) > 关键词:抽象接口 > > 提供一个接口,可以创建一系列相关或相互依赖的对象,而无需指定它们具体的类。 * [原型模式 Prototype](https://e.gitee.com/xmzm/repos/xmzm/design-patterns/tree/master/prototype) > 关键词:原型实例、拷贝 > > 用原型实例指定创建对象的类型,并且通过拷贝这个原型来创建新的对象。 * [构建器模式 Builder](https://e.gitee.com/xmzm/repos/xmzm/design-patterns/tree/master/builder) > 关键词:类和构造分离 > > 将一个复杂类的表示与其构造相分离,使得相同的构建过程能够得出不同的表示。 #### PHP 实战结构型模式(8种) 这些设计模式关注类和对象的组合。继承的概念被用来组合接口和定义组合对象获得新功能的方式。 * [桥接模式 Bridge](https://e.gitee.com/xmzm/repos/xmzm/design-patterns/tree/master/bridge) > 关键词:抽象和实现分离 > > 将类的抽象部分和它的实现部分分离开来,使它们可以独立地变化。 * [享元模式 Flyweight](https://e.gitee.com/xmzm/repos/xmzm/design-patterns/tree/master/flyweight) > 关键词:细粒度、共享 > > 提供支持大量细粒度对象共享的有效方法。 * [外观模式 Facade](https://e.gitee.com/xmzm/repos/xmzm/design-patterns/tree/master/facade) > 关键词:对外统一接口 > > 定义一个高层接口,为子系统中的一组接口提供一个一致的外观,从而简化了该子系统的使用。 * [适配器模式 Adapter](https://e.gitee.com/xmzm/repos/xmzm/design-patterns/tree/master/adapter) > 关键词:转换、兼容接口 > > 将一个类的接口转换成用户希望得到的另一种接口。它使原本不相容的接口得以协同工作。 * [装饰模式 Decorator](https://e.gitee.com/xmzm/repos/xmzm/design-patterns/tree/master/decorator) > 关键词:附加职责 > > 动态地给一个对象添加一些额外的职责。它提供了用子类扩展功能的一个灵活的替代,比派生一个子类更加灵活。 * [组合模式 Composite](https://e.gitee.com/xmzm/repos/xmzm/design-patterns/tree/master/composite) > 关键词:整体-部分、树形结构 > > 将对象组合成树形结构以表示“整体-部分”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。 * [代理模式 Proxy](https://e.gitee.com/xmzm/repos/xmzm/design-patterns/tree/master/proxy) > 关键词:代理控制 > > 为其他对象提供一种代理以控制这个对象的访问。 * [过滤器模式 Filter](https://e.gitee.com/xmzm/repos/xmzm/design-patterns/tree/master/filter) > 关键词:过滤、连接 > > 允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。这种类型的设计模式属于结构型模式,它结合多个标准来获得单一标准。 #### PHP 实战行为型模式(12种) 这些设计模式特别关注对象之间的通信。 * [模板方法模式 Template Method](https://e.gitee.com/xmzm/repos/xmzm/design-patterns/tree/master/template) > 关键词:算法骨架 > > 定义一个操作中的算法骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重新定义算法的某些特定步骤。 * [策略模式 Strategy](https://e.gitee.com/xmzm/repos/xmzm/design-patterns/tree/master/strategy) > 关键词:算法替换 > > 定义一系列算法,把它们一个个封装起来,并且使它们之间可互相替换,从而让算法可以独立于使用它的用户而变化。 * [状态模式 State](https://e.gitee.com/xmzm/repos/xmzm/design-patterns/tree/master/state) > 关键词:状态变成类 > > 允许一个对象在其内部状态改变时改变它的行为。 * [观察者模式 Observer](https://e.gitee.com/xmzm/repos/xmzm/design-patterns/tree/master/observer) > 关键词:通知、自动更新 > > 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。 * [责任链模式 Chain Of Responsibility](https://e.gitee.com/xmzm/repos/xmzm/design-patterns/tree/master/chainOfResponsibility) > 关键词:传递请求、职责、链接 > > 通过给多个对象处理请求的机会,减少请求的发送者与接收者之间的耦合。将接收对象链接起来,在链中传递请求,直到有一个对象处理这个请求。 * [访问者模式 Visitor](https://e.gitee.com/xmzm/repos/xmzm/design-patterns/tree/master/visitor) > 关键词:数据和操作分离 > > 表示一个作用于某对象结构中的各元素的操作,使得在不改数各元素的类的前提下定义作用于这些元素的新操作。 * [解释器模式 Interpreter](https://e.gitee.com/xmzm/repos/xmzm/design-patterns/tree/master/interpreter) > 关键词:解释器、虚拟机 > > 给定一种语言,定义它的文法表示,并定义一个解释器,该解释器用来根据文法表示来解释语言中的句子。 * [备忘录模式 Memento](https://e.gitee.com/xmzm/repos/xmzm/design-patterns/tree/master/memento) > 关键词:保存、恢复 > > 在不破坏封装性的前提下,捕获一个对象的内部状态,并在保存该对象之外保存这个状态,从而可以在以后将该对象恢复到原先保存的状态。 * [命令模式 Command](https://e.gitee.com/xmzm/repos/xmzm/design-patterns/tree/master/command) > 关键词:日志记录、可撤销 > > 将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化,将请求排队或记录请求日志,支持可撤销的操作。 * [迭代器模式 Iterator](https://e.gitee.com/xmzm/repos/xmzm/design-patterns/tree/master/iterator) > 关键词:顺序访问、不暴露内部 > > 提供一种方法来顺序访问一个聚合对象中的各个元素而不需要暴露该对象的内部表示。 * [中介者模式 Mediator](https://e.gitee.com/xmzm/repos/xmzm/design-patterns/tree/master/mediator) > 关键词:不直接引用 > > 用一个中介对象来封装一系列的对象交互。它使各对象不需要显式地相互调用,从而达到低耦合,还可以独立地改变对象间的交互。 * [空对象模式 Null Object](https://e.gitee.com/xmzm/repos/xmzm/design-patterns/tree/master/nullObject) > 关键词:不做任何动作的关系 > > 一个空对象取代 NULL 对象实例的检查。Null 对象不是检查空值,而是反应一个不做任何动作的关系。这样的 Null 对象也可以在数据不可用的时候提供默认的行为。 > 在空对象模式中,我们创建一个指定各种要执行的操作的抽象类和扩展该类的实体类,还创建一个未对该类做任何实现的空对象类,该空对象类将无缝地使用在需要检查空值的地方。 #### 其他:J2EE模式 这些设计模式特别关注表示层。这些模式是由 Sun Java Center 鉴定的。 * MVC 模式(MVC Pattern) * 业务代表模式(Business Delegate Pattern) * 组合实体模式(Composite Entity Pattern) * 数据访问对象模式(Data Access Object Pattern) * 前端控制器模式(Front Controller Pattern) * 拦截过滤器模式(Intercepting Filter Pattern) * 服务定位器模式(Service Locator Pattern) * 传输对象模式(Transfer Object Pattern) ### 测试用例 25 种设计模式都提供测试用例,使用方法 1. 克隆项目: git clone git@gitee.com:xmzm/design-patterns.git 2. 运行脚本: php [文件夹名称]/test.php 3. 例如测试责任链模式: 运行 php chainOfResponsibility/test.php ### 其他语言实现 * [Java语言实现](https://www.runoob.com/design-pattern/design-pattern-tutorial.html)