php设计模式之适配器模式,即adapter(别名wrapper)模式:将一个类的接口,转换成客户期望的另一个类的接口。适配器可以让原本接口不兼容的类合作无间。php设计模式之适配器模式,即adapter(别名wrapper)模式:将一个类的接口,转换成客户期望的另一个类的接口。适配器可以让原本接口不兼容的类合作无间。
这种设计模式的要点:1)、适配器模式主要应用于“希望复用一些现存的类,但是接口又与复用环境要求不一致的情况”,在遗留代码复用、类库迁移等方面非常有用。2)、适配器模式有对象适配器和类适配器两种形式的实现结构,但是类适配器采用“多继承”的实现方式,带来了不良的高耦合,所以一般不推荐使用。对象适配器采用“对象组合”的方式,更符合松耦合精神。
我们通过以下两个图片来看下其结构:类的适配器模式结构图(继承)对象的适配器模式结构图(组合)
(对象适配器的代码实现)
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源进行适配。
