适配器模式

适配器模式:

将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原来由于接口不兼容而不能一起工作的那此类可以一起工作。

主要角色:
Target(目标角色):客户希望使用的接口,需要适配成这个接口。
Adaptee(源角色):被适配的接口,需要进行适配的接口。
Adapter(适配角色):对Adaptee的接口与Target接口进行适配;适配器是本模式的核心,适配器把源接口转换成目标接口,此角色为具体类。

适用场景
1、你想使用一个已经存在的类,而它的接口不符合你的需求
2、你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类协同工作
3、你想使用一个已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口(仅限于对象适配器)

适配器模式分为类适配器和对象适配器,不考虑类适配器了,两种适配器的区别和适配器模式的抽象代码可参考:http://blog.csdn.net/wzllai/article/details/7832815

一个实例

一个纸书的打开和翻页接口,但是后来出现了电子书,只有启动和下一页接口,怎么适配呢?

interface PaperBookInterface {
    public function turnPage();
    public function open();
}


class Book implements PaperBookInterface {
    public function open() {
        echo "打开纸书";
    }
    public function turnPage() {
        echo "纸书翻页";
    }
}


interface EBookInterface {
    public function pressNext();
    public function pressStart();
}


class Kindle implements EBookInterface {
    public function pressNext() {
        echo "按下一页";
    }

    public function pressStart() {
        echo "按开关启动";
    }
}

class EBookAdapter implements PaperBookInterface{
    private $ebook;
    
    public function __construct(EBookInterface $kindle){
        $this->ebook = $kindle;
    }
    public function open() {
        $this->ebook->pressStart();
    }
    public function turnPage() {
        $this->ebook->pressNext();
    }
    
    
}
$book = new Book();
$book->open();
$book->turnPage();

$kindle = new EBookAdapter(new Kindle());
$kindle->open();
$kindle->turnPage();
原文地址:https://www.cnblogs.com/leezhxing/p/4714675.html