策略模式


/**
 * 策略模式:
 * 问题的提出:
 * 在此模式中,算法是从复杂类提取的,因而可以方便地替换。例如,如果要更改搜索引擎中排列页的方法,则策略模式是一个不错的选择。思考一下搜索引擎的几个部分 —— 一部分遍历页面,一部分对每页排列,另一部分基于排列的结果排序。在复杂的示例中,这些部分都在同一个类中。通过使用策略* 模式,您可将排列部分放入另一个类中,以便更改页排列的方式,而不影响搜索引擎的其余代码。
 * 问题的解决:
 * 呵呵,不讲那么复杂,刚才魔兽好不容易打开了,我们还是玩魔兽好了。
 * 下面我们选battle,哇好多种族啊,有人族(Human),兽族(ORC),暗夜精灵族(Nighy Elf),不死族(Undead)。我选精灵族(Nighy Elf),再选一个精灵族和两个兽族(ORC),一个兽族和我是一家的,另一个精灵族和兽族是另一家的。
 * 每一个玩家在进入游戏后都会得到一些资源,如一个大厅,五个小精灵(苦工)和一个矿山。这些可以称为是初始化的一些东西,这里我们就可以用到策略模式来封装这些初始化。
 */

/**
 * 首先我们来构建一个玩家类
 */
class player
{
    protected $_name;        //玩家名字

    protected $_race;        //种族

    protected $army;        //队伍

    protected $building;    //建筑

    protected $population;    //人口

    protected $gold;        //黄金

    protected $wood;        //木材

    //构造函数,设定所属种族

    public function __construct($race)

    {
        $this->race = $race;
    }

    //__get()方法用来获取保护属性

    private function __get($property_name)

    {
        if(isset($this->$property_name)) {
            return($this->$property_name);
        }
        else {
            return(NULL);
        }

    }

    //__set()方法用来设置保护属性

    private function __set($property_name,$value)
    {
        $this->$property_name=$value;
    }
}

/**
 * 接着,我们再建一个玩家初始化的接口
 */
interface initialPlayer
{
    //制造初始化的部队

    public function giveArmy($player);

    //制造初始化的建筑

    public function giveBuilding($player);

    //初始化资源

    public function giveSource($player);
}

/**
 * 精灵族
 */
class NighyElfInitial implements initialPlayer
{

    //制造初始化的部队

    public function giveArmy($player)

    {
        //五个小精灵

        for($i=0; $i<=5;$i++)
        {
            $creator = new CreatArms();    //这个是创建部队类,在后面得工厂模式中会用到,这里我就不多说了
                
            $player->army[] = $creator->Creat('Wisp','./Arms/');
        }
    }

    //制造初始化的建筑
    public function giveBuilding($player)

    {
        $creator = new CreatBuildings();

        //一个基地

        $player->building[] = $creator->Creat('TownHall','./Buildings/');

        //一个矿场

        $player->building[] = $creator->Creat('Mine','./Buildings/');

    }



    //初始化人口上限

    public function giveSource($player)

    {

        $player->population= 10;

        $player->gold= 1000;

        $player->wood= 100;

    }
}

/**
 * 兽族
 */
class ORCInitial implements initialPlayer
{

    //制造初始化的部队

    public function giveArmy($player)
    {
        //五个苦工
        for($i=0; $i<=5;$i++)

        {
            $creator = new CreatArms();//这个是创建部队类,在后面得工厂模式中会用到,这里我就不多说了

            $player->army[] = $creator->Creat('Peon','./Arms/');

        }
    }

    //制造初始化的建筑

    public function giveBuilding($player)

    {
        $creator = new CreatBuildings();

        //一个基地

        $player->building[] = $creator->Creat('TownHall','./Buildings/');

        //一个矿场

        $player->building[] = $creator->Creat('Mine','./Buildings/');
    }

    //初始化人口上限

    public function giveSource($player)

    {
        $player->population= 10;

        $player->gold= 1000;

        $player->wood= 100;
    }
}

/**
 * 好了,到这里初始化代码就写好了,现在还差一个控制这些初始化得类,也就是封装他们
 */
class initialController
{
    //构造函数,参数为玩家的数组
    public function __construct($playerArray)
    {
        foreach ($playerArray as $player)
        {
            switch ($player->race)
            {
                case 'NighyElf':

                    $initialController = new NighyElfInitial();break;

                case 'ORC':

                    $initialController = new ORCInitial();break;
            }

            $initialController->giveArmy($player);

            $initialController->giveBuilding($player);

            $initialController->giveSupply($player);
        }
    }
}

/**
 * 这就是策略模式,他将不同情况下的算法封装在一起。Zend framework中的Zend_Application_Resource就是用策略模式来设计的。
 */

//有两个精灵族两个兽族

$playerArray = array(new player('NighyElf'), new player('NighyElf'), new player('ORC'), new player('ORC'));

//进行初始化工作

$initialController = new initialController($playerArray);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值