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 中dirname(_file_)讲解
Mar 18 PHP
PHP排序算法的复习和总结
Feb 15 PHP
PHP读取xml方法介绍
Jan 12 PHP
深入php之规范编程命名小结
May 15 PHP
PHP中绘制图像的一些函数总结
Nov 19 PHP
jQuery Mobile + PHP实现文件上传
Dec 12 PHP
PHP实现正则表达式分组捕获操作示例
Feb 03 PHP
thinkPHP中U方法加密传递参数功能示例
May 29 PHP
thinkphp5框架实现的自定义扩展类操作示例
May 16 PHP
php适配器模式简单应用示例
Oct 23 PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
Feb 15 PHP
php中加密解密DES类的简单使用方法示例
Mar 26 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
Erlang的运算符(比较运算符,数值运算符,移位运算符,逻辑运算符)
2012/07/23 PHP
PHP中判断文件存在使用is_file还是file_exists?
2015/04/03 PHP
PHP排序算法类实例
2015/06/17 PHP
PHP使用Redis实现防止大并发下二次写入的方法
2017/10/09 PHP
Js+XML 操作
2006/09/20 Javascript
新鲜出炉的js tips提示效果
2011/04/03 Javascript
javascript 自定义回调函数示例代码
2014/09/26 Javascript
实例讲解JQuery中this和$(this)区别
2014/12/08 Javascript
详解WordPress开发中get_current_screen()函数的使用
2016/01/11 Javascript
详解Angular.js的$q.defer()服务异步处理
2016/11/06 Javascript
js常用DOM方法详解
2017/02/04 Javascript
JavaScript基于activexobject连接远程数据库SQL Server 2014的方法
2017/07/12 Javascript
AngularJS实现的获取焦点及失去焦点时的表单验证功能示例
2017/10/25 Javascript
详解redux异步操作实践
2018/08/15 Javascript
vuejs+element UI点击编辑表格某一行时获取内容填入表单的示例
2018/10/31 Javascript
基于JavaScript实现每日签到打卡轨迹功能
2018/11/29 Javascript
django js 实现表格动态标序号的实例代码
2019/07/12 Javascript
JavaScript实现拖拽和缩放效果
2020/08/24 Javascript
Python 字符串操作方法大全
2014/03/11 Python
python实现在控制台输入密码不显示的方法
2015/07/02 Python
Python Unittest自动化单元测试框架详解
2018/04/04 Python
终端命令查看TensorFlow版本号及路径的方法
2018/06/13 Python
Django model序列化为json的方法示例
2018/10/16 Python
详解Python 爬取13个旅游城市,告诉你五一大家最爱去哪玩?
2019/05/07 Python
python绘制已知点的坐标的直线实例
2019/07/04 Python
python爬虫 批量下载zabbix文档代码实例
2019/08/21 Python
Django前后端分离csrf token获取方式
2020/12/25 Python
苹果台湾官网:Apple台湾
2019/01/05 全球购物
英国IT硬件供应商,定制游戏PC:Mesh Computers
2019/03/28 全球购物
日本整理专家Marie Kondo的官方在线商店:KonMari
2020/06/29 全球购物
大学生学习生活的自我评价
2013/11/01 职场文书
写好自荐信的要点
2013/11/06 职场文书
肖申克的救赎观后感
2015/06/02 职场文书
2016秋季校长开学典礼致辞
2015/11/26 职场文书
Nginx已编译的nginx-添加新模块
2021/04/01 Servers
Python matplotlib安装以及实现简单曲线的绘制
2022/04/26 Python