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 相关文章推荐
一个程序下载的管理程序(一)
Oct 09 PHP
PHP通过正则表达式下载图片到本地的实现代码
Sep 19 PHP
php数组函数序列之in_array() 查找数组值是否存在
Oct 29 PHP
Yii入门教程之Yii安装及hello world
Nov 25 PHP
php实现RSA加密类实例
Mar 26 PHP
PHP闭包函数传参及使用外部变量的方法
Mar 15 PHP
10个对初学者非常有用的PHP技巧
Apr 06 PHP
php ucwords() 函数将字符串中每个单词的首字符转换为大写(实现代码)
May 12 PHP
示例详解Laravel的注册重构
Aug 14 PHP
作为PHP程序员你要知道的另外一种日志
Jul 30 PHP
PHP实现的服务器一致性hash分布算法示例
Aug 09 PHP
PHP命名空间用法实例分析
Sep 04 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代码的53条建议
2008/03/27 PHP
php 301转向实现代码
2008/09/18 PHP
PHP使用PHPMailer发送邮件的简单使用方法
2013/11/12 PHP
php ucwords() 函数将字符串中每个单词的首字符转换为大写(实现代码)
2016/05/12 PHP
php判断是否为ajax请求的方法
2016/11/29 PHP
Yii2实现增删改查后留在当前页的方法详解
2017/01/13 PHP
PHP7使用ODBC连接SQL Server2008 R2数据库示例【基于thinkPHP5.1框架】
2019/05/06 PHP
JavaScript对象链式操作代码(jquery)
2010/07/04 Javascript
javascript Array.prototype.slice使用说明
2010/10/11 Javascript
关于jquery append() html时的小问题的解决方法
2010/12/16 Javascript
用js调用迅雷下载代码的二种方法
2013/04/15 Javascript
javascript使用smipleChart实现简单图表
2015/01/02 Javascript
JS+CSS实现的日本门户网站经典选项卡导航效果
2015/09/27 Javascript
js修改onclick动作的四种方法(推荐)
2016/08/18 Javascript
Vue.2.0.5过渡效果使用技巧
2017/03/16 Javascript
JS判断非空至少输入两个字符的简单实现方法
2017/06/23 Javascript
基于js 字符串indexof与search方法的区别(详解)
2017/12/04 Javascript
express如何解决ajax跨域访问session失效问题详解
2019/06/20 Javascript
pm2启动ssr失败的解决方法
2019/06/29 Javascript
深入浅析ng-bootstrap 组件集中 tabset 组件的实现分析
2019/07/19 Javascript
vue.js 子组件无法获取父组件store值的解决方式
2019/11/08 Javascript
[03:21]辉夜杯主赛事 12月25日TOP5
2015/12/26 DOTA
[01:19:35]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#2Fnatic VS OG第二局
2016/03/05 DOTA
python通过apply使用元祖和列表调用函数实例
2015/05/26 Python
python:socket传输大文件示例
2017/01/18 Python
python字符串Intern机制详解
2019/07/01 Python
pytorch中tensor.expand()和tensor.expand_as()函数详解
2019/12/27 Python
40行Python代码实现天气预报和每日鸡汤推送功能
2020/02/27 Python
Python实现从N个数中找到最大的K个数
2020/04/02 Python
python报错: 'list' object has no attribute 'shape'的解决
2020/07/15 Python
详细分析Python collections工具库
2020/07/16 Python
英国在线女鞋目的地:SIMMI
2018/12/27 全球购物
美国孩之宝玩具官网:Hasbro Pulse
2019/06/24 全球购物
党员学习中共十八大思想报告
2014/09/12 职场文书
公司党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
村党组织公开承诺书
2015/04/30 职场文书