日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

uml和模式应用 pdf_总结分享:PHP中常见的五种设计模式

發(fā)布時間:2024/9/27 php 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 uml和模式应用 pdf_总结分享:PHP中常见的五种设计模式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

設(shè)計模式不僅代表著更快開發(fā)健壯軟件的有用方法,而且還提供了以友好的術(shù)語封裝大型理念的方法。例如,您可以說您正在編寫一個提供松散耦合的消息傳遞系統(tǒng),也可以說你正在編寫名稱為 觀察者 的模式。

用較小的示例展示模式的價值是非常困難的。這往往有些大材小用的意味,因為模式實際上是在大型代碼庫中發(fā)揮作用的。本文不展示大型應(yīng)用程序,所以您需要思索的是在您自己的大型應(yīng)用程序中應(yīng)用示例原理的方法 —— 而不是本文演示的代碼本身。這不是說您不應(yīng)該在小應(yīng)用程序中使用模式。很多良好的應(yīng)用程序都以小應(yīng)用程序為起點,逐漸發(fā)展到大型應(yīng)用程序,所以沒有理由不以此類扎實的編碼實踐為基礎(chǔ)。

既然您已經(jīng)了解了設(shè)計模式以及它們的有用之處,現(xiàn)在我們來看看 PHP V5 的五種常用模式。

一、工廠模式

最初在設(shè)計模式 一書中,許多設(shè)計模式都鼓勵使用松散耦合。要理解這個概念,讓我們最好談一下許多開發(fā)人員從事大型系統(tǒng)的艱苦歷程。在更改一個代碼片段時,就會發(fā)生問題,系統(tǒng)其他部分 —— 您曾認為完全不相關(guān)的部分中也有可能出現(xiàn)級聯(lián)破壞。

該問題在于緊密耦合 。系統(tǒng)某個部分中的函數(shù)和類嚴重依賴于系統(tǒng)的其他部分中函數(shù)和類的行為和結(jié)構(gòu)。您需要一組模式,使這些類能夠相互通信,但不希望將它們緊密綁定在一起,以避免出現(xiàn)聯(lián)鎖。

在大型系統(tǒng)中,許多代碼依賴于少數(shù)幾個關(guān)鍵類。需要更改這些類時,可能會出現(xiàn)困難。例如,假設(shè)您有一個從文件讀取的 User 類。您希望將其更改為從數(shù)據(jù)庫讀取的其他類,但是,所有的代碼都引用從文件讀取的原始類。這時候,使用工廠模式會很方便。

工廠模式 是一種類,它具有為您創(chuàng)建對象的某些方法。您可以使用工廠類創(chuàng)建對象,而不直接使用 new。這樣,如果您想要更改所創(chuàng)建的對象類型,只需更改該工廠即可。使用該工廠的所有代碼會自動更改。

清單 1 顯示工廠類的一個示列。等式的服務(wù)器端包括兩個部分:數(shù)據(jù)庫和一組 PHP 頁面,這些頁面允許您添加反饋、請求反饋列表并獲取與特定反饋相關(guān)的文章。

清單 1. Factory1.php

<?phpinterface IUser{ function getName();} class User implements IUser{ public function __construct($id) { } public function getName() { return "Jack"; }} class UserFactory{ public static function Create($id) { return new User($id); }} $uo = UserFactory::Create(1);echo($uo->getName() . "");?>

IUser 接口定義用戶對象應(yīng)執(zhí)行什么操作。IUser 的實現(xiàn)稱為 User,UserFactory 工廠類則創(chuàng)建 IUser 對象。此關(guān)系可以用圖 1 中的 UML 表示

如果您使用 php 解釋器在命令行上運行此代碼,將得到如下結(jié)果:

php factory1.phpJack

測試代碼會向工廠請求 User 對象,并輸出 getName 方法的結(jié)果。

有一種工廠模式的變體使用工廠方法。類中的這些公共靜態(tài)方法構(gòu)造該類型的對象。如果創(chuàng)建此類型的對象非常重要,此方法非常有用。例如,假設(shè)您需要先創(chuàng)建對象,然后設(shè)置許多屬性。此版本的工廠模式會將該進程封裝在單個位置中,這樣,不用復(fù)制復(fù)雜的初始化代碼,也不必將復(fù)制好的代碼在在代碼庫中到處粘貼。

清單 2 顯示使用工廠方法的一個示例。

清單 2. Factory2.php

<?phpinterface IUser{ function getName();} class User implements IUser{ public static function Load($id) { return new User($id); } public static function Create() { return new User(null); } public function __construct($id) { } public function getName() { return "Jack"; }} $uo = User::Load(1);echo($uo->getName() . "");?>

這段代碼要簡單得多。它僅有一個接口 IUser 和一個實現(xiàn)此接口的 User 類。User 類有兩個創(chuàng)建對象的靜態(tài)方法。此關(guān)系可用圖 2 中的 UML 表示。

圖 2. IUser 接口和帶有工廠方法的 user 類

在命令行中運行腳本產(chǎn)生的結(jié)果與清單 1 的結(jié)果相同,如下所示:

php factory2.phpJack

如上所述,有時此類模式在規(guī)模較小的環(huán)境中似乎有些大材小用。不過,最好還是學(xué)習(xí)這種扎實的編碼形式,以便應(yīng)用于任意規(guī)模的項目中。

二、單元素模式

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

單元素模式可以滿足此要求。如果應(yīng)用程序每次包含且僅包含一個對象,那么這個對象就是一個單元素(Singleton)。清單 3 中的代碼顯示了 PHP V5 中的一個數(shù)據(jù)庫連接單元素。

清單 3. Singleton.php

此代碼顯示名為 DatabaseConnection 的單個類。您不能創(chuàng)建自已的 DatabaseConnection,因為構(gòu)造函數(shù)是專用的。但使用靜態(tài) get方法,您可以獲得且僅獲得一個 DatabaseConnection 對象。此代碼的 UML 如圖 3 所示。

圖 3. 數(shù)據(jù)庫連接單元素

在兩次調(diào)用間,handle 方法返回的數(shù)據(jù)庫句柄是相同的,這就是最好的證明。您可以在命令行中運行代碼來觀察這一點。

php singleton.phpHandle = Object id #3Handle = Object id #3

返回的兩個句柄是同一對象。如果您在整個應(yīng)用程序中使用數(shù)據(jù)庫連接單元素,那么就可以在任何地方重用同一句柄。

您可以使用全局變量存儲數(shù)據(jù)庫句柄,但是,該方法僅適用于較小的應(yīng)用程序。在較大的應(yīng)用程序中,應(yīng)避免使用全局變量,并使用對象和方法訪問資源。

三、觀察者模式

觀察者模式為您提供了避免組件之間緊密耦合的另一種方法。該模式非常簡單:一個對象通過添加一個方法(該方法允許另一個對象,即觀察者 注冊自己)使本身變得可觀察。當可觀察的對象更改時,它會將消息發(fā)送到已注冊的觀察者。這些觀察者使用該信息執(zhí)行的操作與可觀察的對象無關(guān)。結(jié)果是對象可以相互對話,而不必了解原因。

一個簡單示例是系統(tǒng)中的用戶列表。清單 4 中的代碼顯示一個用戶列表,添加用戶時,它將發(fā)送出一條消息。添加用戶時,通過發(fā)送消息的日志觀察者可以觀察此列表。

清單 4. Observer.php

<?phpinterface IObserver{ function onChanged($sender, $args);} interface IObservable{ function addObserver($observer);} class UserList implements IObservable{ private $_observers = array(); public function addCustomer($name) { foreach($this->_observers as $obs) { $obs->onChanged($this, $name); } } public function addObserver($observer ) { $this->_observers[] = $observer; }} class UserListLogger implements IObserver{ public function onChanged($sender, $args) { echo("'$args' added to user list"); }} $ul = new UserList();$ul->addObserver(new UserListLogger());$ul->addCustomer("Jack");?>

此代碼定義四個元素:兩個接口和兩個類。IObservable 接口定義可以被觀察的對象,UserList 實現(xiàn)該接口,以便將本身注冊為可觀察。IObserver 列表定義要通過怎樣的方法才能成為觀察者,UserListLogger 實現(xiàn) IObserver 接口。圖 4 的 UML 中展示了這些元素。

圖 4. 可觀察的用戶列表和用戶列表事件日志程序

如果在命令行中運行它,您將看到以下輸出:

php observer.php'Jack' added to user list

測試代碼創(chuàng)建 UserList,并將 UserListLogger 觀察者添加到其中。然后添加一個消費者,并將這一更改通知 UserListLogger。

認識到 UserList 不知道日志程序?qū)?zhí)行什么操作很關(guān)鍵。可能存在一個或多個執(zhí)行其他操作的偵聽程序。例如,您可能有一個向新用戶發(fā)送消息的觀察者,歡迎新用戶使用該系統(tǒng)。這種方法的價值在于 UserList 忽略所有依賴它的對象,它主要關(guān)注在列表更改時維護用戶列表并發(fā)送消息這一工作。

此模式不限于內(nèi)存中的對象。它是在較大的應(yīng)用程序中使用的數(shù)據(jù)庫驅(qū)動的消息查詢系統(tǒng)的基礎(chǔ)。

四、命令鏈模式

命令鏈 模式以松散耦合主題為基礎(chǔ),發(fā)送消息、命令和請求,或通過一組處理程序發(fā)送任意內(nèi)容。每個處理程序都會自行判斷自己能否處理請求。如果可以,該請求被處理,進程停止。您可以為系統(tǒng)添加或移除處理程序,而不影響其他處理程序。清單 5 顯示了此模式的一個示例。

清單 5. Chain.php

<?phpinterface ICommand{ function onCommand($name, $args);} class CommandChain{ private $_commands = array(); public function addCommand($cmd) { $this->_commands[] = $cmd; } public function runCommand($name, $args) { foreach ($this->_commands as $cmd ) { if ($cmd->onCommand($name, $args)) { return; } } }} class UserCommand implements ICommand{ public function onCommand($name, $args) { if ($name != 'addUser' ) { return false; } echo("UserCommand handling 'addUser'"); return true; }} class MailCommand implements ICommand{ public function onCommand($name, $args) { if ($name != 'mail') { return false; } echo("MailCommand handling 'mail'"); return true; }} $cc = new CommandChain();$cc->addCommand(new UserCommand());$cc->addCommand(new MailCommand());$cc->runCommand('addUser', null);$cc->runCommand('mail', null);?>

此代碼定義維護 ICommand 對象列表的 CommandChain 類。兩個類都可以實現(xiàn) ICommand 接口 —— 一個對郵件的請求作出響應(yīng),另一個對添加用戶作出響應(yīng)。 圖 5 給出了 UML。

圖 5. 命令鏈及其相關(guān)命令

如果您運行包含某些測試代碼的腳本,則會得到以下輸出:

php chain.phpUserCommand handling 'addUser'MailCommand handling 'mail'

代碼首先創(chuàng)建 CommandChain 對象,并為它添加兩個命令對象的實例。然后運行兩個命令以查看誰對這些命令作出了響應(yīng)。如果命令的名稱匹配 UserCommand 或 MailCommand,則代碼失敗,不發(fā)生任何操作。

為處理請求而創(chuàng)建可擴展的架構(gòu)時,命令鏈模式很有價值,使用它可以解決許多問題。

五、策略模式

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

作為一個較簡單的示例,清單 6 顯示了一個用戶列表類,它提供了一個根據(jù)一組即插即用的策略查找一組用戶的方法。

清單 6. Strategy.php

<?phpinterface IStrategy{ function filter($record);} class FindAfterStrategy implements IStrategy{ private $_name; public function __construct($name) { $this->_name = $name; } public function filter($record) { return strcmp($this->_name, $record) <= 0; }} class RandomStrategy implements IStrategy{ public function filter($record) { return rand(0, 1) >= 0.5; }} class UserList{ private $_list = array(); public function __construct($names) { if ($names != null) { foreach($names as $name) { $this->_list[]= $name; } } } public function add($name) { $this->_list[] = $name; } public function find($filter) { $recs = array(); foreach ($this->_list as $user) { if ($filter->filter($user)) { $recs []= $user; } } return $recs; }} $ul = new UserList(array("Andy

總結(jié)

以上是生活随笔為你收集整理的uml和模式应用 pdf_总结分享:PHP中常见的五种设计模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。