策略模式之东拼西凑
星际开地图对战,等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);
?>
用途总结:策略模式可以将不同情况下的算法封装,根据具体的情况调用。
实现总结:需要一个接口,规定算法规范,使用者(比如初始化来)只要调用对应的算法就可以了。
?
附:
<?php
//打折接口
interface IDiscountor
{
??? public function getDiscount();
}
//普通用户打折类
class commonDiscountor implements IDiscountor
{
??? public function getDiscount()
??? {
??????? $discount = 1;
??????? return $discount;
??? }
}
//高级用户打折类
class advanceDiscountor implements IDiscountor
{
??? public function getDiscount()
??? {
??????? $discount = 0.9;
??????? return $discount;
??? }
}
//vip用户打折类
class vipDiscountor implements IDiscountor
{
??? public function getDiscount()
??? {
??????? $discount = 0.8;
??????? return $discount;
??? }
}
//打折类
class discountor
{
??? public function getDiscount($rank)
??? {
??????? switch ($rank) {
??????? case 'common':
??????????? $discountor = new commonDiscountor();
??????????? break;
??????? case 'advance':
??????????? $discountor = new advanceDiscountor();
??????????? break;
??????? case 'vip':
??????????? $discountor = new vipDiscountor();
??????????? break;
??????? }
??????? return $discountor->getDiscount();
??? }
}
$discountor = new discountor();
echo $discountor->getDiscount('advance');
这个就是策略模式(Strategy),将不同情况的算法分拆到不同的类(比如advanceDiscountor类),然后调用者(discountor类)根据具体的情况,用算法类的对象来处理。