設計模式之適配器模式--不兼容變兼容接口

設計模式之適配器模式–不兼容變兼容接口

適配器模式可以增加接口的易用性,使得不兼容的接口變得兼容。

將一個接口轉換成另外的接口,使得原本不兼容的接口變得兼容。

爲什麼要使用適配器模式

比如你的接口設計存在缺點,不夠易用,不能複用但又希望複用的時候。

比如你要對接多個平臺的接口他們互不兼容的時候。

現實中也有很多適配器,比如安卓蘋果的轉換頭,比如usb到type-c的轉換頭,都是因爲兩邊的接口不同,不兼容所以需要一個適配器。

下面是一個手機類,現在需要充電,但是手機的充電需要typec接口。

/**
 * 適配器模式
 * 手機類
 */
class mobile {
    
    /**
     * 給手機充電操作
     */
    public function charge(ITypec $typec) {
        dump('使用typec接口給手機充電');
        $typec->typec();
    }

}

現在只有一個usb接口可以充電。

/**
 * 適配器模式
 * 需要適配的類
 * usb接口
 */
class usb {
    
    /**
     * 接口
     */
    public function usb() {
        dump('電腦usb接口');
    }

}

我們增加一個適配器,也就是typec轉usb的頭。

/**
 * 適配器模式
 * 適配器接口
 * typec接口
 */
interface ITypec {
    /**
     * 接口
     */
    public function typec();

}

/**
 * 適配器模式
 * 適配器類,typec轉換usb的適配器
 * typec接口
 */
class typec implements ITypec {
    
    private $usb;

    function __construct() {
        $this->usb = new usb;
    }

    /**
     * 接口
     */
    public function typec() {
        dump('接口適配器');
        $this->usb->usb();
    }

}

我們的客戶端就可以使用這個適配器了。


$mobile = new mobile();

$mobile->charge(new typec);

這是對象適配器,還有類適配器,類適配器的話需要繼承要適配的類。


/**
 * 適配器模式
 * 適配器類,typec轉換usb的適配器
 * typec接口
 */
class typec extends usb implements ITypec {
    
    //不再需要存儲對象,直接繼承了

    /**
     * 接口
     */
    public function typec() {
        dump('接口適配器');
        //$this->usb->usb();
        //這裏改成使用父類的usb方法。
        parent::usb();
    }

}

適配器和代理模式還有裝飾器模式的區別

這幾個設計模式其實都差不多,你也可以說使用了typec代理了usb。只是角度不同所以名字不同罷了。

  • 代理模式 更注重代理,代理了原有類。
  • 裝飾器模式 比代理模式更加靈活多樣。
  • 適配器模式 更注重兼容性,爲了兼容別的類,而不是代理和裝飾功能。

雖然角度不同,但是我覺得核心都差不多。這幾個設計模式都是需要修改原有類的時候,沒有選擇修改,而是套了殼子,來擴展功能。這是一種好的思想,靈活運用思想更重要。

代碼放在了我的github上面。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章