首页 > 语言 > 关键词  > 魔兽最新资讯  > 正文

从魔兽看PHP设计模式

2009-09-07 11:09 · 稿源:Chinaz用户投稿

前段时间看到有人用魔兽来解释设计模式,感觉很有意思,于是我把它改了改,又添加了些设计模式内容,今天发出来。有些地方借鉴了前人的内容,没有注明,请前人不要见怪啊。

这里用大家感兴趣的魔兽3来讨论PHP的几种常见的设计模式:单件模式、策略模式、工厂模式、观察者模式。今天就讲这四个吧,以后继续。

这些设计模式,都是针对面向对象来说的,所以都用PHP5,另外在这里我想说的是PHP4从2008年8月8日(我记得是和北京奥运会同一天,没查证,呵呵)的时候官方就发了最后一个PHP4的补丁,这意味这PHP4的时代已经终结,所以,我建议大家现在就别理PHP4吧,就以PHP5来说吧。

一、单件模式:

问题的提出:

某些应用程序资源是独占的,因为有且只有一个此类型的资源。例如,通过数据库句柄到数据库的连接是独占的。您希望在应用程序中共享数据库句柄,因为在保持连接打开或关闭时,它是一种开销,在获取单个页面的过程中更是如此。

问题的解决:

那么下面我们就开始玩魔兽吧。首先双击war3.exe,这时候就开始运行魔兽了。我们用代码来实现吧。

<?php
class War3
{

public function __construct()

{

echo "War3 is Running.","<br />";

}
}
$war = new War3();

运行!很好,输出

War3 is Running.

我们已经可以开始游戏了,但是,如果我在代码末尾再加入

$war2 = new War3();

$war3 = new War3();

会怎么样呢?我们试试,输出结果:

War3 is Running.

War3 is Running.

War3 is Running.

完了,如果不小心双击了两次就开了3个魔兽,那如果再双击几次,那电脑肯定爆掉。。。我们还是来想想解决方法吧。

既然我们不能这么随意的就把这个类实例化了,那么我们就把构造函数改成私有方法。

class War3
{

private function __construct()

{

echo "War3 is Running.","<br />";

}
}

可是私有变量外部是无法访问的,这样以来,我们就连一个都打不开了啊。别急,我们再给他加一个不用通过实例化,外部也能访问的函数,那就是静态函数,
class War3
{

private function __construct()

{

echo "War3 is Running.","<br />";

}

 

public static function runWar()

{

 

}
}

通过这个静态的方法runWar()我们来控制类War3的实例化,那么还缺上一个标识,我们再创建一个标识,通过这个标识来表示我们的类是否已经实例化,如果实例化,直接返回句柄就行了。

把类修改成

class War3
{

protected static $_instance = null;

private function __construct()

{

echo "War3 is Running.","<br />";

}

 

public static function runWar()

{

if (null === self::$_instance) {

self::$_instance = new self();

}


return self::$_instance;

}
}

当然,我们运行魔兽时的实例化也要换种方法,就通过
$war = War3::runWar();
就能开始玩魔兽了,好了,下面把完整的代码附上来:

<?php
class War3
{

protected static $_instance = null;

private function __construct()

{

echo "War3 is Running.","<br />";

}

public static function runWar()

{

if (null === self::$_instance) {

self::$_instance = new self();

}


return self::$_instance;

}
}

$war = War3::runWar();
$war2 = War3::runWar();
$war3 = War3::runWar();

运行一下,结果是:

War3 is Running.

太好了,我双击了这么多次,也就只运行了一个魔兽,现在随便你怎么打开,机子都不会爆掉了。

这就是传说中的单价模式,主要用于一些很占资源的而且实例仅有一个实例就够用的东西,比如,zend framework中的Zend_Controller_Front前端控制器,就是采用单价模式来设计的,大家有兴趣的话可以看看那个。

二、策略模式:

问题的提出:

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

问题的解决:

呵呵,不讲那么复杂,刚才魔兽好不容易打开了,我们还是玩魔兽好了。
下面我们选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;

}
}

举报

  • 相关推荐
  • iPhone 17 Pro长得像充电宝上热搜 全新设计引网友热议

    距离苹果新一代旗舰手机iPhone17 系列正式登场仅剩约 1 个月时间,目前新机外观已基本确定,据称这将是苹果史上变化最大的手机。今日,“iPhone17Pro长得像充电宝”这一词条冲上微博热搜榜,瞬间引发网友们的热烈讨论。 从设计细节来看,iPhone 17 Pro系列采用了横向大矩阵Deco设计,摄像头布局别具一格,左侧安置三摄,右侧则集成闪光灯与LiDAR扫描仪。不仅如此,该系列在材

  • 厦门创客匠人靠谱吗?从模式与实践看创始人IP服务的行业探索

    在流量红利消退、市场竞争加剧的当下,创始人IP成为企业突破增长瓶颈的重要抓手。创客匠人作为IP孵化服务机构,从"知识变现"转型"IP变现",构建"工具+陪跑+商学院"三位一体服务体系。其首创"结果式付费"模式,仅在达成成果后分成,降低用户试错风险。团队覆盖120余行业,每月更新百万级案例方法论,已实现单场变现超百万元案例近百个,累计GMV超1亿元。通过差异化定位和全链路服务,既帮助创业者首月变现破百万,也助力传统企业年销突破3000万元。当前行业面临个性化与标准化平衡等挑战,但创客匠人通过十年沉淀的5万+服务案例和生态化布局,为行业从"流量收割"向"价值深耕"转型提供了实践样本。

  • 7年来首次大变!iPhone 17 Pro横向相机岛隐藏这两招

    苹果即将发布新一代iPhone 17系列,其中iPhone 17 Pro系列将采用全新的横向矩形相机岛”设计。 这一设计预示着相机模块的重磅升级,此外最新爆料还指出,这种设计还将有助于提升5G与Wi-Fi的连线品质。 据海外博主透露,iPhone 17 Pro系列将首次调整天线位置,将其整合在体积更大的背部相机模块中,并环绕于四周,以增强网络信号的接收与稳定性,尤其在室内环境中效果显著。

  • 荣耀Magic V Flip2官宣:背板采用独特工艺 璀璨星空设计

    今日,荣耀正式对外官宣了新一代小折叠旗舰——荣耀Magic V Flip2,瞬间吸引了众多数码爱好者的目光。不过,官方目前尚未公布该机的具体发布时间,但提前晒出了新机外观图,让大众得以一窥其背板设计的独特魅力。 此次荣耀Magic V Flip2再度携手Professor Jimmy Ch oo周仰杰博士精心打造。据介绍,从设计细节来看,每一处都精准到毫米,尽显优雅气质;每一次开合手机,都仿佛能

  • iPhone17Pro最新外观曝光:苹果调整天线布局

    ​近日,有博主在社交平台分享了iPhone 17 Pro的全新渲染图,引发科技圈广泛关注。此次苹果对iPhone 17 Pro的天线布局进行了重新设计,有望为用户带来更出色的信号体验。 从渲染图可以清晰看到,iPhone 17 Pro的天线布局与以往机型有明显不同。除了金属中框上保留天线条外,其矩阵相机模组也环绕了一圈天线条。这样的设计并非随意为之,而是有着实际意义。当用户握持设备时

  • iPhone 17全系手机膜曝光:Air屏幕尺寸介于Pro和Pro Max之间

    近日,海外数码媒体披露了一组疑似iPhone 17 系列屏幕保护贴膜的照片,首次展现了即将发布的iPhone 17 Air与其他型号的屏幕尺寸差异。 根据图片显示,iPhone 17 Air手机的屏幕尺寸介于iPhone 17 Pro与iPhone 17 Pro Max之间,画面排列顺序依次为:iPhone 17、iPhone 17 Pro、iPhone 17 Air,最后是iPhone 17 Pro Max。 依据目前的传闻,iPhone 17 Air可能搭载OLED屏幕,预计对角线尺寸为约6.6英寸,部分消息�

  • iPhone 18 Pro首发!苹果最强基带曝光

    上个月微软面向商业客户推出了Surface Laptop 5G版本,它支持Nano SIM卡和eSIM两种方式,还可作为热点为其他设备提供网络。在Surface Laptop推出5G之际,苹果也在着手准备5G版Mac设备。 苹果记者Mark Gurman爆料,苹果最快会在2026年在Mac电脑上配备自研5G基带芯片,这将是苹果史上首款支持5G网络的Mac设备。 据悉,2026年的Mac电脑将搭载苹果新一代基带芯片C2,这颗基带由iPhone 18 Pro率先搭

  • 真我新机撞脸iPhone 17 Pro:镜头排布一模一样

    博主数码闲聊站曝光了真我新机,该机采用横向大矩阵DECO,摄像头排布跟即将发布的iPhone 17 Pro一模一样。该博主爆料,真我将会抢先苹果发布这款新品。 如图所示,真我新机的三摄布局跟iPhone 17 Pro一致,唯一区别是iPhone 17 Pro相机右侧配备LIDAR激光雷达扫描仪,真我没有这项配置。 另外,渲染图显示真我新品搭载骁龙7 Gen4平台,这意味着该机是一款中端产品。

  • 成本、效率差距太大!苹果短期不会在美国生产iPhone

    特朗普关税战的最重要目的之一,就是逼制造业回流,其中iPhone在美国生产一事也引发关注。 对此,名记马克古尔曼表示了自己的看法:正如我之前多次强调的,至少在短期内,苹果绝无可能在美国启动iPhone大规模量产。” 他强调,从成本、规模及工程角度看,这在目前都是不现实的。即便是在印度,苹果也耗费了近十年时间才刚刚能生产出一定比例的iPhone。 另外,未来�

  • 苹果iPhone 17全系涨价没跑了!

    投资机构GF Securities的首席分析师JeffPu称,iPhone 17全系机型都将涨价,包括在美国。 这与近段时间很多分析师的意见相同,目前来看iPhone 17涨价已经基本成为定局。 iPhone 17可能涨价的主要原因是关税,华尔街分析师预计,iPhone 17系列机型的价格可能会比相应的iPhone 16机型高出50美元至100美元。 不过,即使价格真的上涨,苹果也可能会想出巧妙的办法来应对这种情况,比如将iP