PHP设计模式学习笔记

TL;DR

设计模式有助于写出组织结构更为合理的代码,少数实现上也和语言特性有所关系。

设计模式的样例以及说明网上都存在很多的样例,本文作为学习笔记,只简要记录学习过程中的个人理解的一些要点,如有错误,烦请指出。

笔记

创建性模式

单例模式

  • 构造方法变为私有(不能通过new关键字产生对象)
  • 只能通过实例获取方法获得实例
  • 所有操作共享一个静态对象
  • __clone魔术方法要被禁用防止对象被copy
  • __wake魔术方法要禁用防止被反序列化

简单工厂模式

  • 实现一个带有工厂方法的类,负责生成其他类的对象
  • 一次只能返回一个对象

工厂方法模式

  • 用于生成多个有共同特性的对象
  • 多个工厂必须继承相同的接口或者抽象类
  • 工厂生成的各类对象必须继承相同的接口或者抽象类

抽象工厂模式

  • 工厂类包含多种方法,可以生成多个对象
  • 在工厂方法中约束了可以产生的各个类型的对象
  • 其他类似工厂方法模式

对象池模式

  • 管理多个单例

原型模式

  • 用于复杂对象的创建
  • 本质就是实现对象的深复制

结构性模式

适配器模式

  • 对外定义统一的操作方法
  • 根据操作对象的特性,在统一的操作方法中完成逻辑

桥接模式

  • 解决多个服务提供方对于同一类型的操作接口实现不同的问题
  • 定义一个接口,用于统一对多个服务提供方同类操作
  • 在桥接类中定义一个抽象操作方法,在具体的实现类中实现这一方法,完成实际业务代码和多个服务提供方的操作组合

组合模式

  • 解决需要根据一定情况执行同类操作并且结果需要组合的问题
  • 每个操作对象实现同样的操作接口,操作者逐一执行

装饰器模式

  • 解决需要重复继承带来的方法重复臃肿问题
  • 在实现共性方法之外,确定操作的各个阶段的接口
  • 对于有各个属性的或者操作的类型,编写装饰器,实现各阶段操作的接口,对原始对象进行操作

依赖注入

  • 需要拆分类当中可以替换的部分
  • 将操作需要的对象或者属性在方法参数中提供

门面模式

  • 通过一个简单方法隐藏操作细节
  • 实现一个方法,操作多个多个依赖对象和完成多个逻辑

链式操作

  • 在每个允许的链式操作操作之后返回当前对象

代理模式

  • 代理模式与适配器模式的区别在于代理模式下代理和第三方对象都继承与同一个接口
  • 意义在于在代理中新增逻辑可以不用修改原始对象,反之亦然

注册器模式

  • 将后续可能使用到的对象记录到一个全局空间之中

行为性模式

观察者模式

  • 解决一个操作需要触发多个关联操作的问题
  • 原始对象需要实现注册和通知方法,记录所有注册的观察者
  • 观察者要实现用于通知触发响应的接口,使用前注册

责任链模式

  • 对于同一类操作,实现多个处理者
  • 对于一个处理者,声明无法处理时的下一个处理者,并在自身无法处理时,调用下一个处理者

模板方法

  • 实现虚基类,提取出共性方法并实现逻辑,共性逻辑不得改变
  • 对于共性方法需要依赖的操作对象声明为虚方法,要求子类实现

策略模式

  • 解决多个判断条件下带来的面条式代码问题
  • 基于控制反转(IoC),即将影响逻辑的方法从外部对象传入
  • 声明一个逻辑操作接口,各个策略实现这一个接口
  • 根据现有条件,确定使用策略并将策略类传递给逻辑操作的主体
  • 逻辑操作的主体调用策略类的操作接口

访问者模式

  • 解决需要新增逻辑,但是又无法重写对象的问题
  • 实现一个访问方法,根据注入到该方法的对象,访问该方法的某一个方法,实现逻辑的扩展

状态模式

  • 与策略模式不同的是,不通过在外部确定策略,而是在策略类内部实现非当前策略的策略逻辑操作接口的触发
  • 这个方式会加重策略类

命令模式

  • 允许外部直接通过名称执行特定的逻辑