PHP設計模式(二)抽象類和接口

PHP設計模式(二)抽象類和接口:對於編程來說,對事物的抽象是一個老生常談的話題,抽象問題更利於面向對象編程以及程式設計模式。

和C/C++,Java,Python等語言一樣,PHP也支持面向對象,但是又有略微區別,如PHP支持在接口中定義常量,但是不支持抽象變量。

抽象

對事物的抽象是指,區別兩個不同事物之間的本質特征,這兩個事物應該在某個視角上有明確的區分界限。

如,鯨魚和鯉魚,這兩個事物在動物的視角上,有明確的區分界限,屬於不同的動物;但是在水生動物的視角上,他們屬於同一種動物的抽象。
合理的對問題進行抽象,構造模型,將更容易通過編程來解決問題。
記住:抽象是編程解決問題的基礎,越復雜的問題,越需要一開始就對問題進行抽象,而不是直接寫代碼。

抽象類

抽象類是一個編程概念,PHP中叫Abstract Classes。在設計模式中,抽象類不能夠被實例化/初始化,但是可以依靠具體類的繼承來實現。
有點抽象,對吧?用代碼來解釋:

定義瞭動物這個抽象類,動物的屬性是名字name,然後有一個方法是吃食物eat food。
為什麼動物是抽象類?因為動物這個物種並不是一個存在於自然界的東西,它是人類腦海裡抽象出的東西。存在自然界的是鯨魚和鯉魚這樣的確定性動物。
比如鯨魚的概念,應該是屬於動物,繼承Animal類,我們定義鯨魚這個類以及吃東西的方法:

name = "Whale";
  }
  public function eat($food) {
    echo $this->name . " eat " . $food . ".\n";
  }
}
?>

現在我們可以初始鯨魚類,並且調用吃的方法瞭:

eat("fish");
?>

運行一下:

$ php Whale.php
Whale eat fish.

接口

PHP也支持面向過程編程概念中的接口,下面同樣用鯨魚的例子來講述:

同樣定義一個鯨魚類,來實現上述接口:

現在我們可以初始鯨魚類,並且調用吃的方法瞭:

eat("fish");
?>

運行一下:

$ php Whale.php
Whale eat fish.

抽象類vs接口

上面的抽象類和接口的例子,看上去是不是類似?事實上,對於PHP編程來說,抽象類可以實現的功能,接口也可以實現。
抽象類的接口的區別,不在於編程實現,而在於程式設計模式的不同。
一般來講,抽象用於不同的事物,而接口用於事物的行為。
如:水生生物是鯨魚的抽象概念,但是水生生物並不是鯨魚的行為,吃東西才是鯨魚的行為。
對於大型項目來說,對象都是由基本的抽象類繼承實現,而這些類的方法通常都由接口來定義。
此外,對於事物屬性的更改,建議使用接口,而不是直接賦值或者別的方式,如:

observeEat($whale);
    $this->observeEat($carp);
  }
  function observeEat(IAction $animal) {
    $animal->eat();
  }
}
$observer = new observer();
?>

運行一下:

$ php Observer.php
Whale eat fish.
Carp eat moss.

Summary

好的設計模式是嚴格對問題進行抽象,雖然抽象類和接口對於編程實現來說是類似的,但是對於程式設計模式是不同的。

發佈留言