PHP设计模式9-策略模式

星际开地图对战,等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 giveBuilding($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 giveBuilding($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);

?>


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

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


你可能感兴趣的:(设计模式)