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

关于PHP设计模式之前大话PHP设计模式【1】 和大话PHP设计模式【2】介绍了单例、简单工厂、工厂方法、抽象工厂、建造者、原型模式,这些设计模式都属于创建型模式。本节开始我们将学习结构型设计模式。

适配器模式:将某个对象的接口适配为另一个对象所期望的接口。

为什么需要适配器模式:

  • 某个操作数据库有两套不同的数据库操作方法,我们通过适配器统一成一个接口
  • 有多套数据库对应多种数据库操作
  • 系统的增加一些新功能,创建一个新的接口,但老接口并不想废弃。可用适配器,对用户隐藏两接口,提供用户所希望的接口

p.s: 有写书把适配器模式分:类的适配器模式,对象的适配器模式,接口的适配器模式

适配器模式示例代码

装饰器模式:允许向一个已有的对象添加新的功能或部分内容,同时又不改变其结构。

为什么需要装饰器模式:

  • 对一个已有的对象添加新功能,又不改变其结构
  • 使用子类继承的方法去实现新功能,会不可避免出现子类过多,继承链很长的情况。【建议一个对象的父与子关系不超过3个】
  • 可以提供对对象内容快速非侵入式地修改

装饰器模式示例代码

代理模式:构建了透明于两个不同对象之内的一个对象,从而能够截取或代理这两个对象间的通讯或访问。

为什么需要代理模式:

  • 远程代理:为了一个对象在不同地址空间提供局部代表。隐藏一个对象存在于不同地址空间的事实
  • 虚拟代理:根据需要来创建开销很大的对象,通过它来存放实例化需要很长的真实对象
  • 安全代理:用来控制真实对象的访问对象
  • 智能指引:当调用真实对象的时候,代理处理一些事情

代理模式示例代码

外观模式:为子系统中的一组接口提供一个一致的界面,定义一个高层接口

为什么需要外观模式:

  • 开发阶段,子系统越来越复杂,增加外观模式提供一个简单的调用接口
  • 维护一个大型遗留系统的时候,可能这个系统已经非常难以维护和扩展,但又包含非常重要的功能,为其开发一个外观类,以便新系统与其交互
  • 隐藏自调对象的复杂性。

外观模式示例代码

桥接模式:将抽象与实现解耦,使得两者可以独立的变化

为什么需要桥接模式:

  • 需在构建的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联的关系
  • 抽象化角色和实现化角色可以继承的方式独立扩展而互不影响,在程序运行时可以动态将一个抽象化子类的对象和一个实现化子类的对象进行组合,即系统需要抽象化角色和实现化角色进行动态耦合
  • 虽然在系统中使用基础是没有问题,但由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。对于不希望使用继承或多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适合

桥接模式示例代码

组合模式:将对象组合树形结构以表示“部分整体”的层次结构。使得用户对单个对象和组合对象的使用具有一致性。

为什么需要组合模式:

  • 使我们在树形结构问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。
  • 优化处理递归或分级数据结构

组合模式示例代码

享元模式:池技术的重要实现方式, 运用共享技术有效的支持大量的细粒度对象,用于减少创建对象的数量,以减少内存占用和提高性能。

为什么需要享元模式:

  • 在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。
  • 系统有大量相似对象
  • 需要缓冲池的场景

享元模式示例代码