欧美日韩精品在线,国内精品久久久久久久久,一级毛片恃级毛片直播,清纯唯美亚洲综合欧美色

談從魔獸看PHP設(shè)計模式_PHP教程

編輯Tag賺U幣
教程Tag:暫無Tag,歡迎添加,賺取U幣!

推薦:解析用SSH與PHP相連接 確保數(shù)據(jù)傳輸?shù)陌踩?/a>
SSH可以通過將聯(lián)機的封包加密的技術(shù)進行資料的傳遞; 使用SSH可以把傳輸?shù)乃袛?shù)據(jù)進行加密,即使有人截獲到數(shù)據(jù)也無法得到有用的信息。同時數(shù)據(jù)經(jīng)過壓縮,大大地加快了傳輸?shù)乃俣取?傊ㄟ^SSH的使用,可以確保資料傳輸比較安全并且傳輸效率較高。 不過,

前段時間看到有人用魔獸來解釋設(shè)計模式,感覺很有意思,于是我把它改了改,又添加了些設(shè)計模式內(nèi)容,今天發(fā)出來。有些地方借鑒了前人的內(nèi)容,沒有注明,請前人不要見怪啊。

這里用大家感興趣的魔獸3來討論PHP的幾種常見的設(shè)計模式:單件模式、策略模式、工廠模式、觀察者模式。今天就講這四個吧,以后繼續(xù)。

這些設(shè)計模式,都是針對面向?qū)ο髞碚f的,所以都用PHP5,另外在這里我想說的是PHP4從2008年8月8日(我記得是和北京奧運會同一天,沒查證,呵呵)的時候官方就發(fā)了最后一個PHP4的補丁,這意味這PHP4的時代已經(jīng)終結(jié),所以,我建議大家現(xiàn)在就別理PHP4吧,就以PHP5來說吧。

一、單件模式:

問題的提出:

某些應(yīng)用程序資源是獨占的,因為有且只有一個此類型的資源。例如,通過數(shù)據(jù)庫句柄到數(shù)據(jù)庫的連接是獨占的。您希望在應(yīng)用程序中共享數(shù)據(jù)庫句柄,因為在保持連接打開或關(guān)閉時,它是一種開銷,在獲取單個頁面的過程中更是如此。

問題的解決:

那么下面我們就開始玩魔獸吧。首先雙擊war3.exe,這時候就開始運行魔獸了。我們用代碼來實現(xiàn)吧。

<?php
class War3
{

public function __construct()

{

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

}
}
$war = new War3();

運行!很好,輸出

War3 is Running.

我們已經(jīng)可以開始游戲了,但是,如果我在代碼末尾再加入

$war2 = new War3();

$war3 = new War3();

會怎么樣呢?我們試試,輸出結(jié)果:

War3 is Running.

War3 is Running.

War3 is Running.

完了,如果不小心雙擊了兩次就開了3個魔獸,那如果再雙擊幾次,那電腦肯定爆掉。。。我們還是來想想解決方法吧。

既然我們不能這么隨意的就把這個類實例化了,那么我們就把構(gòu)造函數(shù)改成私有方法。

class War3
{

private function __construct()

{

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

}
}

可是私有變量外部是無法訪問的,這樣以來,我們就連一個都打不開了啊。別急,我們再給他加一個不用通過實例化,外部也能訪問的函數(shù),那就是靜態(tài)函數(shù),
class War3
{

private function __construct()

{

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

}

 

public static function runWar()

{

 

}
}

通過這個靜態(tài)的方法runWar()我們來控制類War3的實例化,那么還缺上一個標識,我們再創(chuàng)建一個標識,通過這個標識來表示我們的類是否已經(jīng)實例化,如果實例化,直接返回句柄就行了。

把類修改成

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();

運行一下,結(jié)果是:

War3 is Running.

太好了,我雙擊了這么多次,也就只運行了一個魔獸,現(xiàn)在隨便你怎么打開,機子都不會爆掉了。

這就是傳說中的單價模式,主要用于一些很占資源的而且實例僅有一個實例就夠用的東西,比如,zend framework中的Zend_Controller_Front前端控制器,就是采用單價模式來設(shè)計的,大家有興趣的話可以看看那個。

二、策略模式:

問題的提出:

在此模式中,算法是從復雜類提取的,因而可以方便地替換。例如,如果要更改搜索引擎中排列頁的方法,則策略模式是一個不錯的選擇。思考一下搜索引擎的幾個部分 —— 一部分遍歷頁面,一部分對每頁排列,另一部分基于排列的結(jié)果排序。在復雜的示例中,這些部分都在同一個類中。通過使用策略模式,您可將排列部分放入另一個類中,以便更改頁排列的方式,而不影響搜索引擎的其余代碼。

問題的解決:

呵呵,不講那么復雜,剛才魔獸好不容易打開了,我們還是玩魔獸好了。
下面我們選battle,哇好多種族啊,有人族(Human),獸族(ORC),暗夜精靈族(Nighy Elf),不死族(Undead)。我選精靈族(Nighy Elf),再選一個精靈族和兩個獸族(ORC),一個獸族和我是一家的,另一個精靈族和獸族是另一家的。

每一個玩家在進入游戲后都會得到一些資源,如一個大廳,五個小精靈(苦工)和一個礦山。這些可以稱為是初始化的一些東西,這里我們就可以用到策略模式來封裝這些初始化。

進入正題,首先我們來構(gòu)建一個玩家類:

<?php
class player
{

//玩家名字

protected $_name;

//種族

protected $_race;

//隊伍

protected $army;

//建筑

protected $building;

//人口

protected $population;

//黃金

protected $gold;

//木材

protected $wood;

//構(gòu)造函數(shù),設(shè)定所屬種族

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()方法用來設(shè)置保護屬性

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);
}

好了,到這里我們就該對這個接口來實現(xiàn)了,為了方便,我只選了兩個種族,就只寫這兩個種族的初始化了:

首先是精靈族:

<?php
class NighyElfInitial implements initialPlayer
{

//制造初始化的部隊

public function giveArmy($player)

{

//五個小精靈

for($i=0; $i<=5;$i++)

{

$creator = new CreatArms();//這個是創(chuàng)建部隊類,在后面得工廠模式中會用到,這里我就不多說了

$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();//這個是創(chuàng)建部隊類,在后面得工廠模式中會用到,這里我就不多說了

$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;

}
}

 

 

分享:解析Windows XP系統(tǒng)下安裝apache+php+mysql
Apache和mysql的安裝較簡單,主要是安裝前請保證80端口未被占用 比如 iis 以前安裝過的apache mysql 先停止運行phpmyadmin,主要是配置文件的問題,把phpMyAdmin安裝目錄下Libraries目錄下面的Config.default.php復制到PHPmyAdmin根目錄下,改 名為Config.in

共2頁上一頁12下一頁
來源:模板無憂//所屬分類:PHP教程/更新時間:2009-10-02
相關(guān)PHP教程