面向對象編程的關鍵點(用php實現面向對象的、變化跟不變化進行僞代碼邏輯進階編程)

提高代碼的複用性,符合OCP原則。本質就是把變化的部分和不變的部分隔離開,使得變化部分發生變化時,不變部分不受影響。


隨着面向對象分析與設計的發展,一個良好的設計,核心原則之一就是將變化隔離,使得變化部分發生變化時,不變部分不受影響(這也是OCP的目的)。爲了做到這一點,要利用面向對象中的多態性,使用多態性後,客戶類不再直接依賴服務類,而是依賴於一個抽象的接口,這樣,客戶類就不能在內部直接實例化具體的服務類。


問題:開發一個打怪物遊戲,主角可以用試用不同的武器攻擊怪物。不同武器,打怪掉血的多少不一樣。編程實現一個靈活的實現該問題的代碼。(充分利用面向對象的原則,將變化的進行接口定義,保證以後的便於的可拓展性。將不變的邏輯封裝進主角中,向外提供一個武器接口,同時一定具有工具怪物的能力。怪物一定具有hp血量,和Benson生命值以及受攻擊血量的創傷量)


code:

<?php


class Hero
{
   //英雄不問出處,所以不用分配名字
   //分配一個武器對象接口,並沒有限定武器的類型跟武器威力
   public $wep;
   public $name;
   function __construct($name)
   {
    $this->name = $name;
   }
   public function Weapon($weapon)
   {
    $this->wep = $weapon;
   }


   public function Attack($moster)
   {
    echo 'Hi,英雄正在打怪物'.$this->name;
    $this->wep->AttackTarget($moster);
   }
}
//統一武器接口類、方便以後武器的拓展
interface Weapons
{
public function AttackTarget(Moster $moster);
}


//槍作爲近距離攻擊武器、威力是每次消滅20滴血
class Gun implements Weapons
{
public function AttackTarget(Moster $moster)
{
echo '用的是手槍';
$moster->Harm(20);
//$moster = $moster;
}
}


class Cannon implements Weapons
{
public function AttackTarget(Moster $moster)
{
echo '用的是大炮';
$moster->Harm(50);
}
}




//怪物類
class Moster
{
//行不改名,坐不掉血~
public $name;
public $hp;
public function __construct($name,$hp)
{
$this->name = $name;
$this->hp = $hp;
}
public function Harm($loss)
{
if($this->hp <=0)
{
echo '怪物名字'.$this->name.'已經死了!!!';
die();
}
$this->hp -= $loss;
if($this->hp <=0)
{
echo '怪物剛剛被消滅</br>';
}
else
{
echo '怪物被失血'.$loss.'</br>';
}
}
}


$tank = new Hero('Tank');
$gun = new Gun();
$tank->Weapon($gun);


//var_dump($weapon);
$moster1 = new Moster('pei',100);


$tank->Attack($moster1);
$tank->Attack($moster1);


//切換大炮
$can = new Cannon();
$tank->Weapon($can);
$tank->Attack($moster1);
$tank->Attack($moster1);






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