php常用的设计模式实践【4】

策略模式:定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化,也称为政策模式。

为什么需要策略模式:

  • 在多种算法相似的情况下,使用if…else所带来的复杂和难以维护
  • 利用面向对象的继承和多态极致,将多个算法解耦。避免类中出现太多if…else语句

Context(应用场景):

  1. 需要使用ConcreteStrategy提供的算法
  2. 内部维护一个Strategy的实例
  3. 负责动态设置运行时Strategy具体的实现算法
  4. 负责跟Strategy之间的交互和数据传递

Strategy(抽象策略类):

定义一个公共接口,使用不同的算法以不同的方式实现这个接口。Context使用这个接口调用不同的算法

ConcreteStrategy(具体策略类):

实现了Strategy定义的接口,提供具体的算法实现

策略模式示例代码

迭代模式:迭代器模式可帮助构造特定的对象,那些对象可提供单一的标准接口循环或迭代任何的可计数数据

为什么需要迭代模式:

  • 我们想要向遍历数组那样遍历对象,或遍历一个容器
  • 迭代器模式可以隐藏遍历元素所需的操作

迭代器模式示例代码

责任链模式:为请求创建了一个接收者对象的链并沿着这条链传递该请求,直到有对象处理为止。

为什么需要责任链模式:

  • 将请求的发送者和请求的处理者解耦了。责任链上的处理者负责处理请求,客户请求发送到职责链上即可,无须关心请求的处理细节和请求的传递
  • 发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,使得系统可以在不影响客户端的情况下动态地重新组织和分配责任

责任链模式示例代码

模板模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

为什么需要模板模式:

  • 一次性实现一个算法的不变部分,可将可变的行为留给子类来实现
  • 多个子类有相同的方法,逻辑基本相同时。可将相同的逻辑代码提取到父类
  • 重构时,将相同代码提取到父类,然后通过钩子函数约束其行为

模板模式示例代码

观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

为什么需要观察者模式:

  • 一个对象状态改变给其他对象的通知的问题,而且要考虑到易用和低耦合,保证高度协作
  • 完美的将观察者和被观察者的对象分离开,使得每个类将重点放在某一个功能上,一个对象做一件事
  • 观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性

观察者模式示例代码