提高代碼的複用性,符合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);