php设计模式之策略模式实例分析【星际争霸游戏案例】


Posted in PHP onMarch 26, 2020

本文实例讲述了php设计模式之策略模式。分享给大家供大家参考,具体如下:

星际开地图对战,等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<4;$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<4;$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程序设计有所帮助。

PHP 相关文章推荐
PHP Session_Regenerate_ID函数双释放内存破坏漏洞
Jan 27 PHP
PHP输出缓存ob系列函数详解
Mar 11 PHP
PHP+javascript制作带提示的验证码源码分享
May 28 PHP
PHP判断表单复选框选中状态完整例子
Jun 24 PHP
PHP fastcgi模式上传大文件(大约有300多K)报错
Sep 28 PHP
php集成环境xampp中apache无法启动问题解决方案
Nov 18 PHP
php对文件进行hash运算的方法
Apr 03 PHP
详解PHP中的null合并运算符
Dec 30 PHP
php 替换文章中的图片路径,下载图片到本地服务器的方法
Feb 06 PHP
PHP将整数数字转换为罗马数字实例分享
Mar 17 PHP
Yii框架分页技术实例分析
Aug 30 PHP
分享几种好用的PHP自定义加密函数(可逆/不可逆)
Sep 15 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
Mar 26 #PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
Mar 24 #PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
Mar 24 #PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
Mar 24 #PHP
php设计模式之原型模式分析【星际争霸游戏案例】
Mar 23 #PHP
php高性能日志系统 seaslog 的安装与使用方法分析
Feb 29 #PHP
PHP中关于php.ini参数优化详解
Feb 28 #PHP
You might like
php获取指定日期之间的各个周和月的起止时间
2014/11/24 PHP
PHP输出九九乘法表代码实例
2015/03/27 PHP
PHP+jQuery+Ajax实现分页效果 jPaginate插件的应用
2015/10/09 PHP
深入理解PHP中的empty和isset函数
2016/05/26 PHP
如何判断php mysqli扩展类是否开启
2016/12/24 PHP
greybox——不开新窗口看新的网页
2007/02/20 Javascript
学习jquery必备 api中英文对照的chm手册 下载
2007/05/03 Javascript
javascipt基础内容--需要注意的细节
2013/04/10 Javascript
jquery获取节点名称
2015/04/26 Javascript
jQuery菜单插件用法实例
2015/07/25 Javascript
js实现鼠标左右移动,图片也跟着移动效果
2017/01/25 Javascript
在 Angular-cli 中使用 simple-mock 实现前端开发 API Mock 接口数据模拟功能的方法
2018/11/28 Javascript
JavaScript实现数字前补“0”的五种方法示例
2019/01/03 Javascript
[05:10]2014DOTA2国际邀请赛 通往胜利之匙赛场探秘之旅
2014/07/18 DOTA
[36:45]TNC vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python实现读取文件最后n行的方法
2017/02/23 Python
Python读取指定目录下指定后缀文件并保存为docx
2017/04/23 Python
python 调用win32pai 操作cmd的方法
2017/05/28 Python
Python3网络爬虫之使用User Agent和代理IP隐藏身份
2017/11/23 Python
pandas获取groupby分组里最大值所在的行方法
2018/04/20 Python
python调用Matplotlib绘制分布点并且添加标签
2018/05/31 Python
python pandas中对Series数据进行轴向连接的实例
2018/06/08 Python
使用Python做垃圾分类的原理及实例代码附源码
2019/07/02 Python
基于python实现的百度音乐下载器python pyqt改进版(附代码)
2019/08/05 Python
Python中sys模块功能与用法实例详解
2020/02/26 Python
PyTorch加载自己的数据集实例详解
2020/03/18 Python
Python如何实现邮件功能
2020/05/27 Python
Python爬虫headers处理及网络超时问题解决方案
2020/06/19 Python
python logging 重复写日志问题解决办法详解
2020/08/04 Python
如何在python中实现线性回归
2020/08/10 Python
建筑专业自我鉴定
2013/10/22 职场文书
会计专业自荐信
2013/12/02 职场文书
就业推荐表院系意见
2015/06/05 职场文书
《狼牙山五壮士》教学反思
2016/02/17 职场文书
vue如何批量引入组件、注册和使用详解
2021/05/12 Vue.js
Vertica集成Apache Hudi重磅使用指南
2022/03/31 Servers