除非注明转载,否则本博客文章皆为原创。 MSN: wfnlxp@hotmail.com QQ: 176564452

用星际学习PHP设计模式9-策略模式

上一篇 / 下一篇  2007-04-06 13:03:41 / 个人分类:面向对象

星际开地图对战,等5秒钟进入地图后,每个玩家都会拥有一个基地,几个农民等,还会有初始的人口供给。但这些是根据种族的不同而不同。

待解决的问题:我们需要根据种族的不同,而对玩家进行不同的初始化,最好将这些不同的处理方式封装。

思路:定义初始化的接口,然后制作不同种族的初始化类。

策略模式(Strategy)示例:

为了使代码不至于过长,一部分类的定义不在此写出,如果要调试,请用字符串等方式替代new。

<?php

//玩家的类

class player {

   //所属种族

  public $race;

  //部队

  public $army;

  //建筑

  public $building;

  //人口供给

  public $supply;

  //构造函数,设定所属种族

  public function __construct($race)

  {

  $this->race = $race;  

  }

}

 

//初始化的接口

interface initialPlayer {

   //制造初始化的部队

  public function giveArmy($player);

  //制造初始化的建筑

  public function giveBuilding($player);

  //初始化人口供给

  public function giveSupply($player);

}

 

//虫族的初始化算法

class zergInitial implements initialPlayer {

    //制造初始化的部队

  public function giveArmy($player)

  {

  //一个Overlord

  $player->army[] = new Overlord();

  //四个虫族农民

    for($i=0; $i<5;$i++)

    {

      $player->army[] = new Drone();

    }

  }

   //制造初始化的建筑

  public function giveBuilding($player)

  {

   //一个基地

   $player->building[] = new Hatchery();

  }

   //初始化人口供给

  public function giveSupply($player)

  {

   //虫族初始人口供给为9

   $player->supply = 9;

  }

}

 

//人族的初始化算法

class terranInitial implements initialPlayer {

    //制造初始化的部队

  public function giveArmy($player)

  {

  //四个人族农民

    for($i=0; $i<5;$i++)

    {

      $player->army[] = new SVC();

    }

  }

   //制造初始化的建筑

  public function giveBuilding($player)

  {

   //一个基地

   $player->building[] = new Hatchery();

  }

   //初始化人口供给

  public function giveSupply($player)

  {

   //人族初始人口供给为10

   $player->supply = 10;

  }

}

 

 

//初始化的控制类

class initialController {

   //构造函数,参数为玩家的数组

  public function __construct($playerArray)

  {

    foreach ($playerArray as $player)

    {

        switch ($player->race)

        {

           case 'zerg':

           $initialController = new zergInitial();

           break;

           case 'terran':

           $initialController = new terranInitial();

           break;

        }

  $initialController->giveArmy($player);

  $initialController->giveBuilding($player);

  $initialController->giveSupply($player);

    }

  }

}

 

//假设两个虫族,一个人族

$playerArray = array(new player('zerg'), new player('zerg'), new player('terran'));

//进行初始化工作

$initialController = new initialController($playerArray);

?>

 

用途总结:策略模式可以将不同情况下的算法封装,根据具体的情况调用。

实现总结:需要一个接口,规定算法规范,使用者(比如初始化来)只要调用对应的算法就可以了。

 


TAG: PHP 设计模式 面向对象 策略模式

lightsaber文锋--原创文章 引用 删除 lightsaber   /   2007-08-29 21:25:01
多谢指正,函数名写错了
ggg Freak 引用 删除 ggg   /   2007-08-29 15:31:08
//假设两个虫族,一个人族
$player1        = new player('zerg');
$player2        = new player('zerg');
$player3        = new player('terran');
$playerArray = array($player1,$player2,$player3);
//进行初始化工作
$initialController = new initialController($playerArray);
print_r($player3);
ggg Freak 引用 删除 ggg   /   2007-08-29 15:27:19
1
//初始化人口供给
  public function giveSupply($player)
不是 giveBuilding
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar