PHP程序员站--PHP编程开发平台
 当前位置:主页 >> PHP高级编程 >> 开发技巧 >> 

从魔兽看PHP设计模式

从魔兽看PHP设计模式

来源:互联网  作者:  发布时间:2009-09-12
在php.cn看到的一篇文章,使用面向对象写程式的phper一定要看看,

二、策略模式:

问题的提出:

在此模式中,算法是从复杂类提取的,因而可以方便地替换。例如,如果要更改搜索引擎中排列页的方法,则策略模式是一个不错的选择。思考一下搜索引擎的几个部分 —— 一部分遍历页面,一部分对每页排列,另一部分基于排列的结果排序。在复杂的示例中,这些部分都在同一个类中。通过使用策略模式,您可将排列部分放入另一个类中,以便更改页排列的方式,而不影响搜索引擎的其余代码。

问题的解决:

呵呵,不讲那么复杂,刚才魔兽好不容易打开了,我们还是玩魔兽好了。
下面我们选battle,哇好多种族啊,有人族(Human),兽族(ORC),暗夜精灵族(Nighy Elf),不死族(Undead)。我选精灵族(Nighy Elf),再选一个精灵族和两个兽族(ORC),一个兽族和我是一家的,另一个精灵族和兽族是另一家的。

每一个玩家在进入游戏后都会得到一些资源,如一个大厅,五个小精灵(苦工)和一个矿山。这些可以称为是初始化的一些东西,这里我们就可以用到策略模式来封装这些初始化。

进入正题,首先我们来构建一个玩家类:

<?php
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;

}
}

接着,我们再建一个玩家初始化的接口,

<?php
interface initialPlayer
{

//制造初始化的部队

public function giveArmy($player);

//制造初始化的建筑

public function giveBuilding($player);

//初始化资源

public function giveSource($player);
}

好了,到这里我们就该对这个接口来实现了,为了方便,我只选了两个种族,就只写这两个种族的初始化了:

首先是精灵族:

<?php
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;

}
}

接下来是兽族:

<?php
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;

}
}

好了,到这里初始化代码就写好了,现在还差一个控制这些初始化得类,也就是封装他们:

<?php
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);

}

}
}

最后就是简单这么一调用,就OK:

<?php
//有两个精灵族两个兽族
$playerArray = array(new player('NighyElf'), new player('NighyElf'), new player('ORC'), new player('ORC'));
//进行初始化工作
$initialController = new initialController($playerArray);

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


延伸阅读:
php中的安全模式是指的什么?
阻碍职业生涯的12种行为模式(ZT)
数据库设计方法、规范与技巧
数据库正规化和设计技巧
设计网站时的十大严重错误
MVC模式的PHP实现
数据库设计的定义
网页表单(input)设计实例技巧五则
PHP程序61条面向对象分析设计的经验原则

Tags: 设计模式   模式   设计   php   魔兽  
最新文章
推荐阅读
月点击排行榜
PHP程序员站 Copyright © 2007-2010,PHPERZ.COM All Rights Reserved 粤ICP备07503606号