欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

php设计模式之策略模式实例分析【星际争霸游戏案例】

程序员文章站 2022-04-09 16:05:05
本文实例讲述了php设计模式之策略模式。分享给大家供大家参考,具体如下:星际开地图对战,等5秒钟进入地图后,每个玩家都会拥有一个基地,几个农民等,还会有初始的人口供给。但这些是根据种族的不同而不同。待...

本文实例讲述了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);
?>

用途总结:策略模式可以将不同情况下的算法封装,根据具体的情况调用。

实现总结:需要一个接口,规定算法规范,使用者(比如初始化来)只要调用对应的算法就可以了。