Adapter 模式(類別版)-極簡範例

Adapter 模式有分類別版和物件版,此範例為類別版本。
此範例用來做公里和英里的轉換,將公里轉換成英里。

首先建立 Kilometer 和 Mile 類別,裡面有一個重要的變數為 $rate,是用來做轉換用的媒介,預設值都為 1。

class Kilometer
{
   private $kilometer; 
   public $rate = 1; 
   
   public function request($kilometerNow)
   {
        $this->kilometer = $kilometerNow;
        return $this->requestTotal();
   }
   
   public function requestTotal()
   {
        $this->kilometer *= $this->rate;
        return $this->kilometer;
   }
}

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

    public function requestTotal()
    {
        $this->mile /= $this->rate;
        return $this->mile;
    }    
}

建立一個介面,裡面有抽象方法 changeRate(),準備用來改變原先的 Mile 裡的 $rate 值。

interface ITarget
{
    public function changeRate();
}

建立一個新類別 MileAdapter 繼承 Mile 並實作 ITarget 裡的方法 changeRate()。
重點在這裡,當實例化時,建構式馬上執行本身 changeRate()方法修改了原先的 $rate 值。

class MileAdapter extends Mile implements ITarget
{
    public function __construct()
    {
        $this->changeRate();
    }
    
    public function changeRate()
    {
        $this->rate = 1.609347;
        return $this->rate;
    }
}

建立 Client 類別,用來實作結果。

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

$worker = new Client();

Browser結果
Kilometer:100kph
Mile:62.137003393302mph