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 相关文章推荐
开源SNS系统-ThinkSNS
May 18 PHP
PHP 第三节 变量介绍
Apr 28 PHP
Zend Studio去除编辑器的语法警告设置方法
Oct 24 PHP
PHP中文分词 自动获取关键词介绍
Nov 13 PHP
php 修改、增加xml结点属性的实现代码
Oct 22 PHP
一个好用的PHP验证码类实例分享
Dec 27 PHP
php编程每天必学之验证码
Mar 03 PHP
PHP函数shuffle()取数组若干个随机元素的方法分析
Apr 02 PHP
PHP实现向关联数组指定的Key之前插入元素的方法
Jun 06 PHP
[原创]PHP实现生成vcf vcard文件功能类定义与使用方法详解【附demo源码下载】
Sep 02 PHP
PHP大文件分割上传 PHP分片上传
Aug 28 PHP
php设计模式之工厂方法模式分析【星际争霸游戏案例】
Jan 23 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时间戳格式全部汇总 (获取时间、时间戳)
2016/06/13 PHP
php使用CutyCapt实现网页截图保存的方法
2016/10/03 PHP
CakePHP框架Session设置方法分析
2017/02/23 PHP
ThinkPHP3.2.3框架邮件发送功能图文实例详解
2019/04/23 PHP
自适应图片大小的弹出窗口
2006/07/27 Javascript
javascript multibox 全选
2009/03/22 Javascript
Extjs TimeField 显示正常时间格式的代码
2011/06/28 Javascript
深入理解JavaScript系列(8) S.O.L.I.D五大原则之里氏替换原则LSP
2012/01/15 Javascript
JS字符串累加Array不一定比字符串累加快(根据电脑配置)
2012/05/14 Javascript
jQuery获取注册信息并提示实现代码
2013/04/21 Javascript
js数组依据下标删除元素
2015/04/14 Javascript
javascript带回调函数的异步脚本载入方法实例分析
2015/07/02 Javascript
基于jquery步骤进度条源码分享
2015/11/12 Javascript
BootStrap智能表单实战系列(六)表单编辑页面的数据绑定
2016/06/13 Javascript
关于JSON与JSONP简单总结
2016/08/16 Javascript
JS提示:Uncaught SyntaxError: Unexpected token ILLEGAL错误的解决方法
2016/08/19 Javascript
Angular页面间切换及传值的4种方法
2016/11/04 Javascript
手机端js和html5刮刮卡效果
2020/09/29 Javascript
JavaScript组件开发之输入框加候选框
2017/03/10 Javascript
全面解析Node.js 8 重要功能和修复
2017/06/02 Javascript
vue.js+Echarts开发图表放大缩小功能实例
2017/06/09 Javascript
浅谈angular4 ng-content 中隐藏的内容
2017/08/18 Javascript
详解用webpack的CommonsChunkPlugin提取公共代码的3种方式
2017/11/09 Javascript
详解Vue中的基本语法和常用指令
2019/07/23 Javascript
vue开发chrome插件,实现获取界面数据和保存到数据库功能
2020/12/01 Vue.js
解决Python 遍历字典时删除元素报异常的问题
2016/09/11 Python
Python构建图像分类识别器的方法
2019/01/12 Python
Python3.6中Twisted模块安装的问题与解决
2019/04/15 Python
简单了解Python多态与属性运行原理
2020/06/15 Python
基于python模拟bfs和dfs代码实例
2020/11/19 Python
文秘大学生求职信
2014/02/25 职场文书
社区工作者演讲稿
2014/05/23 职场文书
慰问信的写作格式及范文!
2019/06/24 职场文书
劳务派遣管理制度(样本)
2019/08/23 职场文书
如何使用Python对NetCDF数据做空间相关分析
2021/04/21 Python
手把手教你用SpringBoot将文件打包成zip存放或导出
2021/06/11 Java/Android