PHP设计模式(十)适配器模式的类适配器的实现

作者: 温新

分类: 【设计模式】

阅读: 2304

时间: 2020-04-08 15:39:29

一、什么是适配器模式

**适配器模式(Adapter)**将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。

理解:

生活中的例子。

手机,现代人的必备品,手机都会的 充电器、数据线 两大必备物品。

这两件东西与适配器模式息息相关,充电器就起到了对200V电流适配的作用。

不使用充电器对手机充电,那么手机一定会被充“爆炸”。

充电器把200V电流转换为手机所需要的V数。转后之后就可以对手机进行充电了。

二、适配器模式结构

目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。

适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。

适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。

三、适配器模式分为:类适配器和对象适配器

四、适配器模式优缺点

优点:

1)一个适配器可以把多种不同的源适配到同一个目标。

换言之,同一个适配器可以把源类和它的子类都适配到目标接口。

因为对象适配器采用的是对象组合的关系,只要对象类型正确,是不是子类都无所谓。

2)符合设计原则:多用合成/聚合、少用继承,从而减少类之间的耦合

缺点:

1)要重定义Adaptee的行为比较困难,这种情况下,需要定义Adaptee的子类来实现重定义,然后让适配器组合子类。

虽然重定义Adaptee的行为比较困难,但是想要增加一些新的行为则方便的很,而且新增加的行为可同时适用于所有的源

2)需要额外的引用来间接得到Adaptee

五、代码实现

class/Adaptee.php

<?php

/**
 * Adaptee 源角色 需要适配的类
 * 
 * 可以理解为
 * 1)墙壁上的插座
 * 2)高压线(需要转换220V才能使用家用电线)
 */
class Adaptee
{
    // 墙壁上的插座
    public function lineBoard(){
        echo '单一功能的2孔插座';
    }
}

class/Target.php

<?php

/**
 * Target目标角色 -->需要进行适配的接口
 * 
 * 可以理解为
 * 1)单一插座转为多功能插座
 * 2)高压线转为200V
 * 3)以及需要的其他功能
 */
interface Target
{
    // 适配插座功能
    public function lineBoard();

    // 添加新的功能,适配成功显示通知
    public function notify();

}

class/Adapter.php

<?php

/**
 * Adapter 适配器适配器,适配 Adaptee 和 Target;
 * 
 * 可以理解为
 * 1)实现target目标接口定义的所要进行适配已经新增的功能
 * 2)这里就已经实现适配了:
 * 如:家里墙壁上的插座就是adaptee。
 * 一个插座显然是不够用的,此时我们就会去买一个多功能接线板来进行适配(也是扩展)这就是target目标接口
 * 。当买回家后,并插上墙壁上的插座后,就已经完成了适配,这是adapter。
 * 最后我们就用这个适配后的接线板同时给给手机和电脑等设备充电了。
 */
class Adapter extends Adaptee implements Target
{
    // 实现新的通知同能
    public function notify()
    {
        echo 'hi,已完成适配 ';
    }

    // 对单一的功能的插座进行适配为多功能插座,也就是重写
    public function lineBoard()
    {
        echo '多功能插座';
    }

}

class/index.php

<?php

/**
 * Adapter 适配器适配器,适配 Adaptee 和 Target;
 * 
 * 可以理解为
 * 1)实现target目标接口定义的所要进行适配已经新增的功能
 * 2)这里就已经实现适配了:
 * 如:家里墙壁上的插座就是adaptee。
 * 一个插座显然是不够用的,此时我们就会去买一个多功能接线板来进行适配(也是扩展)这就是target目标接口。
 * 当买回家后,并插上墙壁上的插座后,就已经完成了适配,这是adapter。
 * 最后我们就用这个适配后的接线板同时给给手机和电脑等设备充电了。
 */
class Adapter extends Adaptee implements Target
{
    // 实现新的通知同能
    public function notify()
    {
        echo 'hi,已完成适配 ';
    }

    // 对单一的功能的插座进行适配为多功能插座,也就是重写
    public function lineBoard()
    {
        echo '多功能插座';
    }

}

我是夕阳何处寻,期待和优秀的你一起同行!

夕阳何处寻

2020年04月08日

请登录后再评论