php适配器模式介绍

 更新时间:2012年08月14日 09:12:52   作者:  
Adapter(别名Wrapper)模式:将一个类的接口,转换成客户期望的另一个类的接口。适配器让原本接口不兼容的类可以合作无间

要点:

1. 适配器模式主要应用于“希望复用一些现存的类,但是接口又与复用环境要求不一致的情况”,在遗留代码复用、类库迁移等方面非常有用。

2. 适配器模式有对象适配器和类适配器两种形式的实现结构,但是类适配器采用“多继承”的实现方式,带来了不良的高耦合,所以一般不推荐使用。对象适配器采用“对象组合”的方式,更符合松耦合精神。

实现:

clip_image002

类的适配器模式结构图(继承)

clip_image004

 

对象的适配器模式结构图(组合)

(对象适配器的代码实现)

Target:定义Client使用的与特定领域相关的接口

public interface Target { void request();}

 

Adaptee:现在需要适配的已经存在的接口

public class Adaptee{ public void specificRequest(){}}

 

Adapter:对Adaptee 的接口与Target接口进行适配

public class Adapter implements Target{ public Adapter(Adaptee adaptee) { super(); this.adaptee = adaptee; } public void request() { adaptee.specificRequest(); } private Adaptee adaptee;}

 

适用性:

1. 系统需要使用现有的类,而此类的接口不符合系统的需要。

2. 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。这些源类不一定有很复杂的接口。

3. (对对象适配器而言)在设计里,需要改变多个已有子类的接口,如果使用类的适配器模式,就要针对每一个子类做一个适配器,而这不太实际。

效果及优缺点:

对于类适配器:

1. 用一个具体的Adapter类对Adaptee和Taget进行匹配。结果是当我们想要匹配一个类以及所有它的子类时,类Adapter将不能胜任工作。

2. 使得Adapter可以override(重定义) Adaptee的部分行为,因为Adapter是Adaptee的一个子类。

对于对象适配器:

1. 允许一个Adapter与多个Adaptee,即Adaptee本身以及它的所有子类(如果有子类的话)同时工作。Adapter也可以一次给所有的Adaptee添加功能。

2. 使得override(重定义)Adaptee的行为比较困难。如果一定要override Adaptee的方法,就只好先做一个Adaptee的子类以override Adaptee的方法,然后再把这个子类当作真正的Adaptee源进行适配。

相关文章

  • PHP封装的Twitter访问类实例

    PHP封装的Twitter访问类实例

    这篇文章主要介绍了PHP封装的Twitter访问类,通过curl调用实现针对Twitter的常用访问功能,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • 详解PHP序列化反序列化的方法

    详解PHP序列化反序列化的方法

    这篇文章主要介绍了PHP序列化反序列化的方法,在一些开源的php源代码中,我们经常看到一些配置文件里面存放的是一些类似带有格式的变量名称和值,想知道这是为什么,请阅读下文
    2015-10-10
  • php最简单的删除目录与文件实现方法

    php最简单的删除目录与文件实现方法

    这篇文章主要介绍了php最简单的删除目录与文件实现方法,只需要两行代码即可实现删除目录与文件的功能,是非常实用的技巧,需要的朋友可以参考下
    2014-11-11
  • php array_chunk()函数用法与注意事项

    php array_chunk()函数用法与注意事项

    这篇文章主要介绍了php array_chunk()函数用法与注意事项,结合实例形式分析了php数组分割函数array_chunk()相关功能、用法及操作注意事项,需要的朋友可以参考下
    2019-07-07
  • php中禁止单个IP与ip段访问的代码小结

    php中禁止单个IP与ip段访问的代码小结

    今天网上有人问我php中如何禁用ip访问,通过测试发现如下的代码不错,原理也比较简单
    2012-07-07
  • PHP中使用localhost连接Mysql不成功的解决方法

    PHP中使用localhost连接Mysql不成功的解决方法

    这篇文章主要介绍了PHP中使用localhost连接Mysql不成功的解决方法,但使用127.0.0.1则没有问题,本文也可以说是对连接MySQL主机使用127.0.0.1与localhost的区别的讲解,需要的朋友可以参考下
    2014-08-08
  • CodeIgniter图像处理类的深入解析

    CodeIgniter图像处理类的深入解析

    本篇文章是对CodeIgniter的图像处理类进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • Discuz开启Gzip压缩多种方法汇总

    Discuz开启Gzip压缩多种方法汇总

    GZip可对多种类型的文件进行压缩,对于CSS、JS、HTML文件具有极高的压缩率,尤其对使用了较多JS特效的网站,开启GZip后压缩比高达70%。
    2023-05-05
  • PHP递归实现汉诺塔问题的方法示例

    PHP递归实现汉诺塔问题的方法示例

    这篇文章主要介绍了PHP递归实现汉诺塔问题的方法,简单描述了汉诺塔问题,并结合实例形式分析了php基于递归算法解决汉诺塔问题的相关操作技巧,需要的朋友可以参考下
    2017-11-11
  • php5.3提示Function ereg() is deprecated Error问题解决方法

    php5.3提示Function ereg() is deprecated Error问题解决方法

    这篇文章主要介绍了php5.3提示Function ereg() is deprecated Error问题解决方法,主要是由于php5.3对ereg()函数升级造成的,使用时只要对其规则和函数进行简单的修改即可,需要的朋友可以参考下
    2014-11-11

最新评论