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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。