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代码把全角数字转为半角数字
Dec 10 PHP
PHP 全角转半角实现代码
May 16 PHP
PHP中根据IP地址判断城市实现城市切换或跳转代码
Sep 04 PHP
php的POSIX 函数以及进程测试的深入分析
Jun 03 PHP
PHP字符串word末字符实现大小写互换的方法
Nov 10 PHP
PHP图片处理之使用imagecopy函数添加图片水印实例
Nov 19 PHP
6个超实用的PHP代码片段
Aug 10 PHP
浅谈php中的访问修饰符private、protected、public的作用范围
Nov 20 PHP
centos下file_put_contents()无法写入文件的原因及解决方法
Apr 01 PHP
php出租房数据管理及搜索页面
May 23 PHP
Laravel中unique和exists验证规则的优化详解
Jan 28 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
Mar 26 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
PHP图片上传类带图片显示
2006/11/25 PHP
PHP 危险函数全解析
2009/09/09 PHP
php常用hash加密函数
2014/11/22 PHP
PHP魔术方法的使用示例
2015/06/23 PHP
Laravel 5.1 on SAE环境开发教程【附项目demo源码】
2016/10/09 PHP
Kindeditor编辑器添加图片上传水印功能(php代码)
2017/08/03 PHP
js弹出层永远居中实现思路及代码
2013/11/29 Javascript
Jqgrid设置全选(选择)及获取选择行的值示例代码
2013/12/28 Javascript
javascript实现iframe框架延时加载的方法
2014/10/30 Javascript
node.js中的http.response.removeHeader方法使用说明
2014/12/14 Javascript
node.js中的fs.lchownSync方法使用说明
2014/12/16 Javascript
JQuery实现的购物车功能(可以减少或者添加商品并自动计算价格)
2015/01/13 Javascript
JavaScript设置、获取、清除单值和多值cookie的方法
2015/11/17 Javascript
谈谈javascript中使用连等赋值操作带来的问题
2015/11/26 Javascript
JavaScript判断按钮被点击的方法
2015/12/13 Javascript
Javascript+CSS3实现进度条效果
2016/10/28 Javascript
Vue2.0基于vue-cli+webpack同级组件之间的通信教程(推荐)
2017/09/14 Javascript
JavaScript引用类型RegExp基本用法详解
2018/08/09 Javascript
JavaScript中的&quot;=、==、===&quot;区别讲解
2019/01/22 Javascript
[01:01:35]Optic vs paiN 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
[01:07:57]DOTA2-DPC中国联赛 正赛 Ehome vs Magma BO3 第二场 1月19日
2021/03/11 DOTA
DataFrame中的object转换成float的方法
2018/04/10 Python
Python中dict和set的用法讲解
2019/03/28 Python
Python3.5 Pandas模块缺失值处理和层次索引实例详解
2019/04/23 Python
django使用admin站点上传图片的实例
2019/07/28 Python
基于Python实现船舶的MMSI的获取(推荐)
2019/10/21 Python
下载与当前Chrome对应的chromedriver.exe(用于python+selenium)
2020/01/14 Python
python爬虫线程池案例详解(梨视频短视频爬取)
2021/02/20 Python
Speedo速比涛中国官方网站:全球领先泳装运动品牌
2018/04/24 全球购物
Three Graces London官网:英国奢侈品牌
2021/03/18 全球购物
给导游的表扬信
2014/01/10 职场文书
业务员岗位职责范本
2015/04/03 职场文书
2015年纪检监察工作总结
2015/04/08 职场文书
学子宴致辞大全
2015/07/27 职场文书
java固定大小队列的几种实现方式详解
2021/07/15 Java/Android
python index() 与 rindex() 方法的使用示例详解
2022/12/24 Python