php设计模式之策略模式实例分析【星际争霸游戏案例】
本文实例讲述了php设计模式之策略模式。分享给大家供大家参考,具体如下:
星际开地图对战,等5秒钟进入地图后,每个玩家都会拥有一个基地,几个农民等,还会有初始的人口供给。但这些是根据种族的不同而不同。
待解决的问题:我们需要根据种族的不同,而对玩家进行不同的初始化,最好将这些不同的处理方式封装。
思路:定义初始化的接口,然后制作不同种族的初始化类。
策略模式(Strategy)示例:
为了使代码不至于过长,一部分类的定义不在此写出,如果要调试,请用字符串等方式替代new。
race=$race;
}
}
//初始化的接口
interfaceinitialPlayer
{
//制造初始化的部队
publicfunctiongiveArmy($player);
//制造初始化的建筑
publicfunctiongiveBuilding($player);
//初始化人口供给
publicfunctiongiveSupply($player);
}
//虫族的初始化算法
classzergInitialimplementsinitialPlayer
{
//制造初始化的部队
publicfunctiongiveArmy($player)
{
//一个Overlord
$player->army[]=newOverlord();
//四个虫族农民
for($i=0;$i<4;$i++)
{
$player->army[]=newDrone();
}
}
//制造初始化的建筑
publicfunctiongiveBuilding($player)
{
//一个基地
$player->building[]=newHatchery();
}
//初始化人口供给
publicfunctiongiveSupply($player)
{
//虫族初始人口供给为9
$player->supply=9;
}
}
//人族的初始化算法
classterranInitialimplementsinitialPlayer
{
//制造初始化的部队
publicfunctiongiveArmy($player)
{
//四个人族农民
for($i=0;$i<4;$i++)
{
$player->army[]=newSVC();
}
}
//制造初始化的建筑
publicfunctiongiveBuilding($player)
{
//一个基地
$player->building[]=newHatchery();
}
//初始化人口供给
publicfunctiongiveSupply($player)
{
//人族初始人口供给为10
$player->supply=10;
}
}
//初始化的控制类
classinitialController
{
//构造函数,参数为玩家的数组
publicfunction__construct($playerArray)
{
foreach($playerArrayas$player)
{
switch($player->race)
{
case'zerg':
$initialController=newzergInitial();
break;
case'terran':
$initialController=newterranInitial();
break;
}
$initialController->giveArmy($player);
$initialController->giveBuilding($player);
$initialController->giveSupply($player);
}
}
}
//假设两个虫族,一个人族
$playerArray=array(
newplayer('zerg'),
newplayer('zerg'),
newplayer('terran'),
);
//进行初始化工作
$initialController=newinitialController($playerArray);
?>
用途总结:策略模式可以将不同情况下的算法封装,根据具体的情况调用。
实现总结:需要一个接口,规定算法规范,使用者(比如初始化来)只要调用对应的算法就可以了。
更多关于PHP相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。