4種常見的 PHP 設計模式

工廠模式

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

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

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

清單 1. Factory1.php
<?php
interface 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()."\n" );
?>

  

單元素模式(單列模式)

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

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

  1. php的應用主要在于數據庫應用, 一個應用中會存在大量的數據庫操作, 在使用面向對象的方式開發時, 如果使用單例模式, 則可以避免大量的new 操作消耗的資源,還可以減少數據庫連接這樣就不容易出現 too many connections情況。
  2. 如果系統中需要有一個類來全局控制某些配置信息, 那么使用單例模式可以很方便的實現. 這個可以參看zend Framework的FrontController部分。
  3. 在一次頁面請求中,?便于進行調
清單 3. Singleton.php
<?php
require_once("DB.php");class DatabaseConnection
{public static function get(){static $db = null;if ( $db == null )$db = new DatabaseConnection();return $db;}private $_handle = null;private function __construct(){$dsn = 'mysql://root:password@localhost/photos';$this->_handle =& DB::Connect( $dsn, array() );}public function handle(){return $this->_handle;}
}print( "Handle = ".DatabaseConnection::get()->handle()."\n" );
print( "Handle = ".DatabaseConnection::get()->handle()."\n" );
?>

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

觀察者模式

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

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

清單 4. Observer.php
<?php
interface 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\n" );}
}$ul = new UserList();
$ul->addObserver( new UserListLogger() );
$ul->add

  

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

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

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

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

% php observer.php 
'Jack' added to user list
%

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

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

此模式不限于內存中的對象。它是在較大的應用程序中使用的數據庫驅動的消息查詢系統的基礎。

?

策略模式

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

清單 5. Strategy.php

轉載于:https://www.cnblogs.com/flyyu21/p/6387295.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373006.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373006.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373006.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

三網合一是指計算機網,什么是三站合一網站?什么是三網合一網站?

原標題&#xff1a;什么是三站合一網站&#xff1f;什么是三網合一網站&#xff1f;三站合一網站和三網合一網站是一個概念&#xff0c;都是指PC網站手機網站微信網站1. 什么是電腦網站指針對普通PC電腦上或筆記本的屏幕進行排版設計的網站&#xff0c;只有在普通PC電腦上或筆記…

使用HMAC(Play 2.0)保護REST服務

我們有HTTPS&#xff0c;還需要什么&#xff1f; 當您談論基于REST的API的安全性時&#xff0c;人們通常會指向HTTPS。 借助HTTPS&#xff0c;您可以使用每個人都熟悉的方法輕松保護您的服務免遭窺視。 但是&#xff0c;當您需要更高級別的安全性或HTTPS不可用時&#xff0c;您…

安裝卡主_智能溫室四周玻璃的安裝學問還這么多

智能玻璃溫室大棚是指頂部及四周以玻璃為覆蓋材料的尖頂溫室大棚&#xff0c;玻璃溫室大棚這幾年的流行是由于紋絡型溫室頂部陽光板問題的抗老化方面容易出現問題。因此很多客戶為了種植獲得更高的透光率&#xff0c;更長的使用年限&#xff0c;因而多選擇全玻璃溫室大棚。那么…

String類詳解(1)

首先String是一個類。  1&#xff0c;實例化String類方法。 1&#xff09;直接賦值&#xff1a;String name"haha"; 2)通過關鍵字&#xff1a;String namenew String("haha"); 2&#xff0c;String類的數據比較。 首先回顧一下&#xff0c;基礎數據的比較…

第六章 計算機網絡與i教案,大學計算機基礎教案第6章計算機網絡基礎與應用.docx...

廣東第二師范學院計算機科學系教案課程名稱計算機基礎I課程代碼111012003課程類型公必√□ 專必□ 專選□ 公選□授課方式講授□ 實踐□案例討論□ 上機√□考核方式考試□√ 考查□上機□√ 論文□教學總學時數16學分數1學時分配課堂講授 2 學時&#xff1b;實踐課 14 學時教材…

分享性能優化問題

談談性能優化問題 代碼層面&#xff1a;避免使用css表達式&#xff0c;避免使用高級選擇器&#xff0c;通配選擇器。 緩存利用&#xff1a;緩存Ajax&#xff0c;使用CDN&#xff0c;使用外部js和css文件以便緩存&#xff0c;添加Expires頭&#xff0c;服務端配置Etag&#xff0…

使用Scala,Play和Akka連接到RabbitMQ(AMQP)

在本文中&#xff0c;我們將研究如何從Scala連接到RabbitMQ&#xff0c;以便可以從應用程序中支持AMQP協議。 在此示例中&#xff0c;我將使用Play Framework 2.0作為容器&#xff08;有關更多信息&#xff0c;請參閱我在該主題上的其他文章 &#xff09;在其中運行應用程序&am…

阿爾法貝塔閥原理_圖總結 - 阿爾法個貝塔 - 博客園

一.思維導圖二.概念筆記圖的存儲結構1. 鄰接矩陣定義&#xff1a;設圖G有n (n大于等于1) 個頂點&#xff0c;則鄰接矩陣是一個n階方陣。當矩陣中的 [i,j] !0(下標從1開始) ,代表其對應的第i個頂點與第j個頂點是連接的特點無向圖的鄰接矩陣是對稱矩陣&#xff0c;n個頂點的無向圖…

WebApi Post 后臺無法獲取參數的解決方案

事件回放&#xff1a; 之前一段時間&#xff0c;公司里前端用的Angularjs 發送http請求也是用的ng的組件&#xff0c;后臺是.Net的WebApi 前端 var data {PArgs: {PageIndex: 0,PageSize: 8,RowsCount: 0} };$http.post("/Api/Test/ABC", data).success(function (d…

南京大學計算機系周小莉,周會群

媒體報道&#xff1a;南京大學周會群&#xff1a;用計算機聰明地做實驗Q《中國教育網絡》A周會群Q&#xff1a;南京大學的高性能計算中心非常特殊&#xff0c;分布在物理&#xff0c;化學、天文、地球科學四個不同的學科中&#xff0c;為什么采取這種模式&#xff1f;A&#xf…

不要慫,就是GAN (生成式對抗網絡) (五):無約束條件的 GAN 代碼與網絡的 Graph...

GAN 這個領域發展太快&#xff0c;日新月異&#xff0c;各種 GAN 層出不窮&#xff0c;前幾天看到一篇關于 Wasserstein GAN 的文章&#xff0c;講的很好&#xff0c;在此把它分享出來一起學習&#xff1a;https://zhuanlan.zhihu.com/p/25071913。相比 Wasserstein GAN &#…

用于MyBatis CRUD操作的Spring MVC 3控制器

到目前為止&#xff0c;我們已經為域類“ User ”創建了CRUD數據庫服務&#xff0c;并且還將MyBatis配置與Spring Configuration文件集成在一起。 接下來&#xff0c;我們將使用Spring MVC創建一個網頁&#xff0c;以使用MyBatis CRUD服務對數據庫執行操作。 使用MyBatis 3創建…

2pin接口耳機_拆解報告:雷柏首款真無線耳機XS200

-----我愛音頻網拆解報告第185篇-----雷柏是一家歷史悠久的鼠標和鍵盤廠商&#xff0c;截至目前&#xff0c;雷柏(rapoo)總共出了四款耳機&#xff0c;此前曾推出過三款藍牙耳機&#xff0c; 分別是S500 藍牙立體聲麥克風耳機&#xff0c;S200 藍牙立體聲麥克風耳機&#xff0c…

html表單中陰影,html5中input表單加邊框,陰影效果.doc

文檔介紹&#xff1a;CSS:input:focus{border-color:#99;}獲取焦點時改變顏色focus能同時改變寬度長度背景色…….form,p(margin-bottom:30px;margin-left:20px;).shadow,.one,.two,.three,.four,.five,.six( height:50px; width:280px; border:C;).shadow( -moz-box-shadow:C;…

帶有GSON和抽象類的JSON

經過多年使用org.json庫在Java中支持JSON數據交換格式后&#xff0c;我已切換到Google Gson 。 org.json是一個較低級的庫&#xff0c;因此您必須創建JSONObject&#xff0c;JSONArray&#xff0c;JSONString等…并執行其他低級工作。 Gson簡化了這項工作。 它提供了簡單的toJs…

深入理解javascript原型和閉包(3)——prototype原型

轉載&#xff0c;原文地址http://www.cnblogs.com/wangfupeng1988/p/3978131.html 既typeof之后的另一位老朋友&#xff01; prototype也是我們的老朋友&#xff0c;即使不了解的人&#xff0c;也應該都聽過它的大名。如果它還是您的新朋友&#xff0c;我估計您也是javascript的…

python 溫度 符號_Python通過小實例入門學習---1.0(溫度轉換)

1.安裝Python 3 下載地址: Welcome to Python.org?www.python.org 2.“溫度轉換”實例:攝氏度--->華氏度 / 華氏度--->攝氏度 TempConvert.py TempStr = input("請輸入帶有符號的溫度值:") if TempStr[-1] in ["f","F"]:C = (eval(Tem…

mysql 修改root密碼

1.找到配置文件my.ini &#xff0c;然后將其打開&#xff0c;可以選擇用記事本打開 C:\Program Files (x86)\MySQL\MySQL Server 5.0 2.打開后&#xff0c;搜索mysqld關鍵字&#xff0c;找到后&#xff0c;在mysqld下面添加skip-grant-tables&#xff0c;保存退出。 PS&#x…

聯想計算機CDROM啟動,聯想電腦光驅啟動問題?

1、開機按del鍵或f2進入bios設置(不同主板按鍵不一樣&#xff0c;一般是DEL&#xff0c;也可能是F2&#xff0c;可以參考下主板說明)&#xff0c;將計算機的啟動模式調成從光盤啟動。也就是從cdrom啟動&#xff0c;根據主板的不同&#xff0c;bios設置有所差異(一般是&#xff…

沒有J2EE容器的JNDI和JPA

我們希望通過盡可能簡單的設置來測試一些JPA代碼。 計劃僅使用Java和Maven&#xff0c;不使用應用程序服務器或其他J2EE容器。 我們的JPA配置需要兩件事才能成功運行&#xff1a; 數據庫來存儲數據&#xff0c; JNDI訪問數據庫。 這篇文章分為兩個部分。 第一部分顯示了如何…