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

 更新时间:2020年03月26日 08:44:04   作者:DavidHHuan  
这篇文章主要介绍了php设计模式之策略模式,结合星际争霸游戏案例形式分析了php策略模式相关原理、用法及操作注意事项,需要的朋友可以参考下

本文实例讲述了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数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总

希望本文所述对大家PHP程序设计有所帮助。

相关文章

  • 微信推送功能实现方式图文详解

    微信推送功能实现方式图文详解

    这篇文章主要介绍了微信推送功能实现方式,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2019-07-07
  • php读取excel文件示例分享(更新修改excel)

    php读取excel文件示例分享(更新修改excel)

    这篇文章主要介绍了php读取excel文件示例,还有更新修改功能,需要的朋友可以参考下
    2014-02-02
  • Laravel框架之blade模板新手入门教程及小技巧

    Laravel框架之blade模板新手入门教程及小技巧

    Blade 是 laravel 提供的一个简单强大的模板引擎。下面这篇文章主要给大家介绍了关于Laravel框架之blade模板新手的入门教程以及一些使用的小技巧,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。
    2017-12-12
  • PHP集成百度Ueditor 1.4.3

    PHP集成百度Ueditor 1.4.3

    我们在做项目的时候经常要遇到编辑器问题,就目前来看百度编辑器还是首选,今天我们就来看下如何在php中集成百度Ueditor,有相同需要的小伙伴参考下吧
    2014-11-11
  • PHP表单提交后引号前自动加反斜杠的原因及三种办法关闭php魔术引号

    PHP表单提交后引号前自动加反斜杠的原因及三种办法关闭php魔术引号

    一般空间商提供的服务器空间默认PHP 指令 magic_quotes_gpc是on的,也就是打开的。我们通常用stripslashes() 函数删除自动添加的反斜杠。
    2015-09-09
  • Zend Framework入门教程之Zend_Registry组件用法详解

    Zend Framework入门教程之Zend_Registry组件用法详解

    这篇文章主要介绍了Zend Framework入门教程之Zend_Registry组件用法,结合实例形式分析了Zend_Registry组件实现对象注册的设置、获取、判断、删除等操作常用技巧,需要的朋友可以参考下
    2016-12-12
  • php生成图片验证码-附五种验证码

    php生成图片验证码-附五种验证码

    这篇文章主要给大家讲解php生成图片验证码,包括数字验证码、数字和字母验证码、中文验证码、仿google验证码、算术验证码,实现此功能主要通过GD库,生成一张带有验证码的图片,并把验证码存在session中,本文讲解的比较全面,需要的朋友可以参考下
    2015-08-08
  • Yii框架布局文件的动态切换操作示例

    Yii框架布局文件的动态切换操作示例

    这篇文章主要介绍了Yii框架布局文件的动态切换操作,结合实例形式分析了Yii框架控制器动态切换布局的相关实现技巧,需要的朋友可以参考下
    2019-11-11
  • PHP新建类问题分析及解决思路

    PHP新建类问题分析及解决思路

    这篇文章给大家介绍php新建类相关问题分析及解决办法,涉及到php新建类相关知识,本文介绍的非常详细,非常具有参考借鉴价值特此分享供大家参考
    2015-11-11
  • ThinkPHP中where()使用方法详解

    ThinkPHP中where()使用方法详解

    where方法可以用于对数据库操作的结果进行筛选。即SQL查询语句中的where子句。本文给大家介绍ThinkPHP中where()使用方法详解,感兴趣的朋友参考下
    2016-04-04

最新评论