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 相关文章推荐
Blitz templates 最快的PHP模板引擎
Apr 06 PHP
仿AS3实现PHP 事件机制实现代码
Jan 27 PHP
应用开发中涉及到的css和php笔记分享
Aug 02 PHP
php中计算程序运行时间的类代码
Nov 03 PHP
PHP简单生成缩略图相册的方法
Jul 29 PHP
php实现搜索类封装示例
Mar 31 PHP
Joomla开启SEF的方法
May 04 PHP
PHP实现bitmap位图排序与求交集的方法
Jul 28 PHP
PHP实现动态压缩js与css文件的方法
May 02 PHP
PHP利用递归函数实现无限级分类的方法
Mar 22 PHP
laravel 实现设置时区的简单方法
Oct 10 PHP
常见的5个PHP编码小陋习以及优化实例讲解
Feb 27 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
php入门小知识
2008/03/24 PHP
适用于php-5.2 的 php.ini 中文版[金步国翻译]
2011/04/17 PHP
php正则表达式(regar expression)
2011/09/10 PHP
PHP文件去掉PHP注释空格的函数分析(PHP代码压缩)
2013/07/02 PHP
Yii使用CLinkPager分页实例详解
2014/07/23 PHP
thinkphp框架无限级栏目的排序功能实现方法示例
2020/03/29 PHP
javascript一元操作符(递增、递减)使用示例
2013/08/07 Javascript
jQuery实现的网页竖向菜单效果代码
2015/08/26 Javascript
jquery 重写 ajax提交并判断权限后 使用load方法报错解决方法
2016/01/19 Javascript
详解angular2封装material2对话框组件
2017/03/03 Javascript
socket.io学习教程之深入学习篇(三)
2017/04/29 Javascript
自定义事件解决重复请求BUG的问题
2017/07/11 Javascript
jquery+ajaxform+springboot控件实现数据更新功能
2018/01/22 jQuery
webpack4之SplitChunksPlugin使用指南
2018/06/12 Javascript
详解基于Vue cli生成的Vue项目的webpack4升级
2018/06/19 Javascript
Vue $mount实战之实现消息弹窗组件
2019/04/22 Javascript
[04:40]2016国际邀请赛中国区预选赛全程TOP10镜头集锦
2016/07/01 DOTA
Python语言实现获取主机名根据端口杀死进程
2016/03/31 Python
Python多线程爬虫实战_爬取糗事百科段子的实例
2017/12/15 Python
Python编程把二叉树打印成多行代码
2018/01/04 Python
pyqt5使用按钮进行界面的跳转方法
2019/06/19 Python
vscode 配置 python3开发环境的方法
2019/09/19 Python
Python Pillow.Image 图像保存和参数选择方式
2020/01/09 Python
Python应用实现处理excel数据过程解析
2020/06/19 Python
Keras: model实现固定部分layer,训练部分layer操作
2020/06/28 Python
Python项目实战之使用Django框架实现支付宝付款功能
2021/02/23 Python
python pyg2plot的原理知识点总结
2021/02/28 Python
自我鉴定思想方面
2013/10/07 职场文书
办公室员工岗位工作职责
2014/03/10 职场文书
积极向上的团队口号
2014/06/06 职场文书
个人存款证明书
2014/10/18 职场文书
2014年镇党建工作汇报材料
2014/11/02 职场文书
简单的离婚协议书范本
2014/11/16 职场文书
师德先进个人材料
2014/12/20 职场文书
2015年秋季运动会加油稿
2015/07/22 职场文书
小学校长开学致辞
2015/07/29 职场文书