15. 星际争霸之php设计模式--策略模式

题记
==============================================================================
本php设计模式专辑来源于博客(jymoz.com),现在已经访问不了了,这一系列文章是我找了很久才找到完整的,感谢作者jymoz的辛苦付出哦!

本文地址:http://www.cnblogs.com/davidhhuan/p/4248199.html
==============================================================================


星际开地图对战,等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);
?>

 

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

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

 

相关文章:

 

1. 星际争霸之php面向对象(一)

2. 星际争霸之php面向对象(二)

3. 星际争霸之php设计模式--简单工厂模式

4. 星际争霸之php设计模式--工厂方法模式

5. 星际争霸之php设计模式--抽象工厂模式

6. 星际争霸之php设计模式--建造器模式

7. 星际争霸之php设计模式--中介者模式

8. 星际争霸之php设计模式--享元模式

9. 星际争霸之php设计模式--代理模式

10. 星际争霸之php设计模式--原型模式

11. 星际争霸之php设计模式--备忘模式

12. 星际争霸之php设计模式--模板模式

13. 星际争霸之php设计模式--正面模式

14. 星际争霸之php设计模式--状态模式

15. 星际争霸之php设计模式--策略模式

16. 星际争霸之php设计模式--组合模式

17. 星际争霸之php设计模式--职责链模式

18. 星际争霸之php设计模式--观察者模式

19. 星际争霸之php设计模式--迭代器模式

20. 星际争霸之php设计模式--适配器模式

posted @ 2015-01-25 14:31 DavidHHuan 阅读(...) 评论(...) 编辑 收藏