php 多態模式

多態性是指相同的操作或函數、過程可作用於多種類型的對象上並獲得不同的結果。不同的對象,收到同一消息將可以產生不同的結果,這種現象稱爲多態性。

多態性允許每個對象以適合自身的方式去響應共同的消息。多態性增強了軟件的靈活性和重用性。

在面向對象的軟件開發中,多態性是最爲重要的部分之一。面向對象編程並不只是將相關的方法與數據簡單的結合起來,而是採用面向對象編程中的各種要素將現實生活中的各種情況清晰的描述出來。這一小節將對面向對象編程中的多態性作詳細的講解。

1.什麼是多態

多 態(Polymorphism)按字面上意思理解就是“多種形狀”。可以理解爲多種表現形式,也即“一個對外接口,多個內部實現方法”。在面向對象的理論 中,多態性的一般定義爲:同一個操作作用於不同的類的實例,將產生不同的執行結果。也即不同類的對象收到相同的消息時,將得到不同的結果。

在實際的應用開發中,採用面向對象中的多態主要在於可以將不同的子類對象都當作一個父類來處理,並且可以屏蔽不同子類對象之間所存在的差異,寫出通用的代碼,做出通用的編程,以適應需求的不斷變化。

2.  多態的應用設計

在實際的應用開發中,通常爲了使項目能夠在以後的時間裏的輕鬆實現擴展與升級,需要通過繼承實現可複用模塊進行輕鬆升級。在進行可複用模塊設計時,就需要儘可能的減少使用流程控制語句。此時就可以採用多態實現該類設計。

【示例】例舉了通常採用流程控制語句實現不同類的處理。其代碼如下所示。

複製代碼
    class painter{                                    //定義油漆工類
public function paintbrush(){ //定義油漆工動作
echo "油漆工正在刷漆!\n";
}
}

class typist{ //定義打字員類
public function typed(){ //定義打字員工作
echo "打字員正在打字!\n";
}
}

function printworking($obj){ //定義處理類
if($obj instanceof painter){ //若對象是油漆工類,則顯示油漆工動作
$obj->paintbrush();
}elseif($obj instanceof typist){ //若對象是打字員類,則顯示打字員動作
$obj->typed();
}else{ //若非以上類,則顯示出錯信息
echo "Error: 對象錯誤!";
}
}

printworking(new painter()); //顯示員工工作
printworking(new typist()); //顯示員工工作
複製代碼




分析:在上述程序中,首先定義兩個員工類:油漆工類和打字員類。然後定義一個處理函數,在該函數中,判斷員工是否爲已經定義的員工,打印出員工的工作狀態。其結果如下所示。 

油漆工正在刷漆  
打字員正在打字


從 以上程序可輕鬆看出,若想顯示其幾種員工的工作狀態,需要首先定義該員工類,並在該員工類中定義員工的工作,然後在printworking()函數中增 加elseif語句以檢查對象是哪一員工類的實例。這在實際的應用中,是非常不可取的。若此時採用多態,則可以輕鬆解決此問題。

可以首先創建一個員工父類,所有的員工類將繼承自該員工父類,並且繼承父類的所有方法與屬性。然後在員工類中創建“是一”關係,判斷是否爲合法的員工。

【示例】例舉了採用多態的方式改寫上例。其代碼如下所示。

複製代碼
class employee{//定義員工父類
protected function working(){//定義員工工作,需要在子類的實現
echo "本方法需要在子類中重載!";
}

}

class painter extends employee{//定義油漆工類
public function working(){//實現繼承的工作方法
echo "油漆工正在刷漆!\n";
}
}

class typist extends employee{//定義打字員類
public function working(){
echo "打字員正在打字!\n";
}
}

class manager extends employee{//定義經理類
public function working(){
echo "經理正在開會!";
}
}

function printworking($obj){//定義處理方法
if($obj instanceof employee){//若是員工對象,則顯示其工作狀態
$obj->working();
}else{//否則顯示錯誤信息
echo "Error: 對象錯誤!";
}
}

printworking(new painter());//顯示油漆工的工作
printworking(new typist());//顯示打字員的工作
printworking(new manager());//顯示經理的工作
複製代碼




分析:在上述程序中,首先定義一個員工基類,並定義一個員工工作狀態的方法。然後定義將繼承自員工基類的三個員工類:油漆工類、打字員類和經理類。然後定義顯示員工工作狀態的方法。並在該方法中創建一個“是一”關係,用於判斷是否爲合法的員工。其結果如下所示。

油漆工正在刷漆! 
打字員正在打字! 
經理正在開會!


從上例可發現,無論增加多少個員工類,只需要實現自員工父類繼承的該員工類和方法。而無須修改顯示員工工作狀態的方法printworking()。

發佈了28 篇原創文章 · 獲贊 0 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章