面向对象编程的关键点(用php实现面向对象的、变化跟不变化进行伪代码逻辑进阶编程)

来源:互联网 发布:老僧扫矿软件 病毒 编辑:程序博客网 时间:2024/06/11 08:37

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






1 0
原创粉丝点击