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 相关文章推荐
Google Voice 短信发送接口PHP开源版(2010.5更新)
Jul 22 PHP
《PHP编程最快明白》第三讲:php数组
Nov 01 PHP
php XPath对XML文件查找及修改实现代码
Jul 27 PHP
解析php中call_user_func_array的作用
Jun 07 PHP
php 判断字符串中是否包含html标签
Feb 17 PHP
PHP产生不重复随机数的5个方法总结
Nov 12 PHP
thinkPHP实现瀑布流的方法
Nov 29 PHP
WordPress中缩略图的使用以及相关技巧
Nov 24 PHP
PHP实现数组转JSon和JSon转数组的方法示例
Jun 14 PHP
PHP利用pdo_odbc实现连接数据库示例【基于ThinkPHP5.1搭建的项目】
May 13 PHP
php创建多级目录与级联删除文件的方法示例
Sep 12 PHP
thinkphp框架表单数组实现图片批量上传功能示例
Apr 04 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
Mar 26 #PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
Mar 24 #PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
Mar 24 #PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
Mar 24 #PHP
php设计模式之原型模式分析【星际争霸游戏案例】
Mar 23 #PHP
php设计模式之代理模式分析【星际争霸游戏案例】
Mar 23 #PHP
php设计模式之享元模式分析【星际争霸游戏案例】
Mar 23 #PHP
You might like
WINDOWS服务器安装多套PHP的另类解决方案
2006/10/09 PHP
php实现的数字验证码及数字运算验证码
2015/07/30 PHP
PHP实现链表的定义与反转功能示例
2018/06/09 PHP
网页中实现浏览器的最大,最小化和关闭按钮
2007/03/12 Javascript
js中eval详解
2012/03/30 Javascript
基于jQuery的input输入框下拉提示层(自动邮箱后缀名)
2012/06/14 Javascript
Javascript中自动切换焦点实现代码
2012/12/15 Javascript
jquery ajax跨域解决方法(json方式)
2014/02/04 Javascript
jQuery中:image选择器用法实例
2015/01/03 Javascript
Bootstrap CSS组件之按钮下拉菜单
2016/12/17 Javascript
json对象及数组键值的深度大小写转换问题详解
2018/03/30 Javascript
如何理解Vue的v-model指令的使用方法
2018/07/19 Javascript
Vue 表情包输入组件的实现代码
2019/01/21 Javascript
vue cli3 调用百度翻译API翻译页面的实现示例
2019/09/13 Javascript
vue实现分页加载效果
2019/12/24 Javascript
微信小程序仿淘宝热搜词在搜索框中轮播功能
2020/01/21 Javascript
js实现九宫格抽奖
2020/03/19 Javascript
浅谈JavaScript节流和防抖函数
2020/08/25 Javascript
Openlayers实现地图全屏显示
2020/09/28 Javascript
python对指定目录下文件进行批量重命名的方法
2015/04/18 Python
python控制台中实现进度条功能
2015/11/10 Python
python实现推箱子游戏
2020/03/25 Python
Python使用到第三方库PyMuPDF图片与pdf相互转换
2019/05/03 Python
python爬虫的一个常见简单js反爬详解
2019/07/09 Python
Python hashlib模块实例使用详解
2019/12/24 Python
css3实现针线缝合效果(图解步骤)
2013/02/04 HTML / CSS
Lookfantastic西班牙官网:英国知名美妆购物网站
2018/06/13 全球购物
Clarks鞋澳大利亚官方网站:Clarks Australia
2019/12/25 全球购物
行政主管岗位职责
2013/11/18 职场文书
秋季运动会稿件
2014/01/30 职场文书
新学期开学标语
2014/06/30 职场文书
安全生产年活动总结
2014/08/29 职场文书
小学教师师德师风自我评价
2015/03/04 职场文书
2015年采购工作总结
2015/04/10 职场文书
golang判断key是否在map中的代码
2021/04/24 Golang
设置IIS Express并发数
2022/07/07 Servers