登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

zczhangchi 的博客

学习笔记

 
 
 

日志

 
 

PHP与魔兽--看PHP设计模式 02(转)  

2009-10-30 11:53:12|  分类: php资料 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

二、策略模式:

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

问题的解决:呵呵,不讲那么复杂,刚才魔兽好不容易打开了,我们还是玩魔兽好了。下面我们选battle,哇好多种族啊,有人族(Human),兽族(ORC),暗夜精灵族(Nighy Elf),不死族(Undead)。我选精灵族(Nighy Elf),再选一个精灵族和两个兽族(ORC),一个兽族和我是一家的,另一个精灵族和兽族是另一家的。每一个玩家在进入游戏后都会得到一些资源,如一个大厅,五个小精灵(苦工)和一个矿山。这些可以称为是初始化的一些东西,这里我们就可以用到策略模式来封装这些初始化。进入正题,首先我们来构建一个玩家类:

Php代码
  1. < ?php class player {   
  2.     //玩家名字   
  3.     protected $_name;   
  4.     //种族   
  5.     protected $_race;   
  6.     //队伍   
  7.     protected $army;   
  8.     //建筑   
  9.     protected $building;   
  10.     //人口   
  11.     protected $population;   
  12.     //黄金   
  13.     protected $gold;   
  14.     //木材   
  15.     protected $wood;   
  16.   
  17.     //构造函数,设定所属种族   
  18.     public    function __construct($race) {   
  19.         $this - >race = $race;   
  20.   
  21.      }   
  22.     //__get()方法用来获取保护属性   
  23.     private    function __get($property_name) {   
  24.         if (isset($this - >$property_name)) {   
  25.             return ($this - >$property_name);   
  26.          } else {   
  27.             return (NULL);   
  28.          }   
  29.      }   
  30.   
  31.     //__set()方法用来设置保护属性   
  32.     private function__set($property_name, $value) {   
  33.         $this - >$property_name = $value;   
  34.      }   
  35. }   
  36. ?>  
< ?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代码
  1. < ?php   
  2. interface initialPlayer {   
  3.     //制造初始化的部队   
  4.     public    function giveArmy($player);   
  5.     //制造初始化的建筑   
  6.     public    function giveBuilding($player);   
  7.     //初始化资源   
  8.     public    function giveSource($player);   
  9. }   
  10. ?>  
< ?php interface initialPlayer {    //制造初始化的部队    public    function giveArmy($player);    //制造初始化的建筑    public    function giveBuilding($player);    //初始化资源    public    function giveSource($player);}?>

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

Php代码
  1. < ?php   
  2. class NighyElfInitial implements initialPlayer {   
  3.     //制造初始化的部队   
  4.     public    function giveArmy($player) {   
  5.         //五个小精灵   
  6.         for ($i = 0; $i <= 5; $i++) {   
  7.             $creator = new CreatArms(); //这个是创建部队类,在后面得工厂模式中会用到,这里我就不多说了   
  8.             $player - >army[] = $creator - >Creat('Wisp', './Arms/');   
  9.          }   
  10.      }   
  11.   
  12.     //制造初始化的建筑   
  13.     public    function giveBuilding($player) {   
  14.         $creator = new CreatBuildings();   
  15.         //一个基地   
  16.         $player - >building[] = $creator - >Creat('TownHall', './Buildings/');   
  17.         //一个矿场   
  18.         $player - >building[] = $creator - >Creat('Mine', './Buildings/');   
  19.      }   
  20.   
  21.     //初始化人口上限   
  22.     public    function giveSource($player) {   
  23.         $player - >population = 10;   
  24.         $player - >gold = 1000;   
  25.         $player - >wood = 100;   
  26.      }   
  27. }   
  28. ?>  
< ?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代码
  1. < ?php   
  2. class ORCInitial implements initialPlayer {   
  3.     //制造初始化的部队   
  4.     public    function giveArmy($player) {   
  5.         //五个苦工   
  6.         for ($i = 0; $i <= 5; $i++) {   
  7.             $creator = new CreatArms(); //这个是创建部队类,在后面得工厂模式中会用到,这里我就不多说了   
  8.             $player - >army[] = $creator - >Creat('Peon', './Arms/');   
  9.          }   
  10.      }   
  11.   
  12.     //制造初始化的建筑   
  13.     public    function giveBuilding($player) {   
  14.   
  15.         $creator = new CreatBuildings();   
  16.         //一个基地   
  17.         $player - >building[] = $creator - >Creat('TownHall', './Buildings/');   
  18.         //一个矿场   
  19.         $player - >building[] = $creator - >Creat('Mine', './Buildings/');   
  20.      }   
  21.   
  22.     //初始化人口上限   
  23.     public    function giveSource($player) {   
  24.         $player - >population = 10;   
  25.         $player - >gold = 1000;   
  26.         $player - >wood = 100;   
  27.      }   
  28. }   
  29. ?>  
< ?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代码
  1. < ?php   
  2. class initialController {   
  3.     //构造函数,参数为玩家的数组   
  4.     public    function __construct($playerArray) {   
  5.         foreach($playerArray as $player) {   
  6.             switch ($player - >race) {   
  7.             case 'NighyElf':   
  8.                 $initialController = new NighyElfInitial();   
  9.                 break;   
  10.             case 'ORC':   
  11.                 $initialController = new ORCInitial();   
  12.                 break;   
  13.              }   
  14.             $initialController - >giveArmy($player);   
  15.             $initialController - >giveBuilding($player);   
  16.             $initialController - >giveSupply($player);   
  17.          }   
  18.      }   
  19. }   
  20. ?>  
< ?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代码
  1. < ?php   
  2. //有两个精灵族两个兽族   
  3. $playerArray = array(new player('NighyElf'), new player('NighyElf'), new player('ORC'), new player('ORC'));   
  4. //进行初始化工作   
  5. $initialController = new initialController($playerArray);   
  6. ?>  
< ?php//有两个精灵族两个兽族$playerArray = array(new player('NighyElf'), new player('NighyElf'), new player('ORC'), new player('ORC'));//进行初始化工作$initialController = new initialController($playerArray);?>

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

  评论这张
 
阅读(125)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018