Adapter 模式(物件版)-極簡範例

物件版本的 Adapter 模式

這個範例一樣是公里換算英里,首先建立一個介面,再建立 Kilometer 類別並實現該介面。
注意,Kilometer 類裡的 $rate 值為 1.609347

interface KUnit
{
    public function request();
    public function requestTotal();
}

class Kilometer implements KUnit
{
   private $kilometer = 100; 
   public $rate = 1.609347; 
   
   public function request()
   {
        return $this->requestTotal();
   }
   
   public function requestTotal()
   {
        $this->kilometer *= $this->rate;
        return $this->kilometer;
   }
}

另外,我們再建立一個英里物件方法要使用的介面,並建立 Mile 類別實現該介面。
注意,Mile 類裡的 $rate 值為 1

interface MUnit
{
    public function request();
    public function requestTotal();
}

class Mile implements MUnit
{
    private $mile = 100;
    public $rate = 1;
    
    public function request()
    {
        return $this->requestTotal();
    }

    public function requestTotal()
    {
        $this->mile *= $this->rate;
        return $this->mile;
    }
    
    public function sayHi()
    {
        echo "<br />Hi.<br />";
    }
}

然後建立一個 Adapter 類,在建構式中要求必需傳入實現 MUnit 介面的物件。
基本上傳入的物件,我們可以執行所有 MUnit 介面的方法,但底下 requestTotal() 內容空白是因為物件自已執行自已本身的方法 requestTotal() 方法,所以按照介面規定我們要實現該方法,但內容空白。

class MileAdapter implements MUnit
{
    private $mile;
    
    public function __construct(MUnit $mileObject)
    {
        $this->mile = $mileObject;
    }
    
    public function request()
    {
        return $this->mile->request();
    }
    
    public function requestTotal()
    {
        //return $this->mile->requestTotal();
    }   
}

最後,我們建立 Client 類別,要注意的是建立 MileAdapter 物件時要傳入 Mile 物件,最後的 sayHi() 方法,我們在 MileAdapter 並不需要實作,直接呼叫 Mile 物件執行。

class Client
{
    private $k;
    private $mAdapter;
    
    public function __construct()
    {
        $this->k = new Kilometer();
        $this->m = new Mile();
        $this->mAdapter = new MileAdapter($this->m);
        
        echo "Kilometer:".$this->k->request()."kph<br />";        
        echo "Mile:".$this->mAdapter->request()."mph";
        $this->m->sayHi();
    }
}

$worker = new Client();

Browser結果
Kilometer:160.9347kph
Mile:100mph
Hi.