小編給大家分享一下常見的PHP設(shè)計(jì)模式有哪些,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!
創(chuàng)新互聯(lián)網(wǎng)站建設(shè)提供從項(xiàng)目策劃、軟件開發(fā),軟件安全維護(hù)、網(wǎng)站優(yōu)化(SEO)、網(wǎng)站分析、效果評(píng)估等整套的建站服務(wù),主營(yíng)業(yè)務(wù)為網(wǎng)站設(shè)計(jì)制作、網(wǎng)站建設(shè),重慶APP軟件開發(fā)以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。創(chuàng)新互聯(lián)深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
策略模式
策略模式是對(duì)象的行為模式,用意是對(duì)一組算法的封裝。動(dòng)態(tài)的選擇需要的算法并使用。
策略模式指的是程序中涉及決策控制的一種模式。策略模式功能非常強(qiáng)大,因?yàn)檫@個(gè)設(shè)計(jì)模式本身的核心思想就是面向?qū)ο缶幊痰亩嘈涡运枷搿?/p>
策略模式的三個(gè)角色:
1.抽象策略角色
2.具體策略角色
3.環(huán)境角色(對(duì)抽象策略角色的引用)
實(shí)現(xiàn)步驟:
1.定義抽象角色類(定義好各個(gè)實(shí)現(xiàn)的共同抽象方法)
2.定義具體策略類(具體實(shí)現(xiàn)父類的共同方法)
3.定義環(huán)境角色類(私有化申明抽象角色變量,重載構(gòu)造方法,執(zhí)行抽象方法)
就在編程領(lǐng)域之外,有許多例子是關(guān)于策略模式的。例如:
如果我需要在早晨從家里出發(fā)去上班,我可以有幾個(gè)策略考慮:我可以乘坐地鐵,乘坐公交車,走路或其它的途徑。每個(gè)策略可以得到相同的結(jié)果,但是使用了不同的資源。
策略模式的代碼實(shí)例:
PrintPage (); } } $bro = new Browser (); echo $bro->call ( new ieAgent () ); ?>
工廠模式
工廠模式是我們最常用的實(shí)例化對(duì)象模式,是用工廠方法代替new操作的一種模式。
使用工廠模式的好處是,如果你想要更改所實(shí)例化的類名等,則只需更改該工廠方法內(nèi)容即可,不需逐一尋找代碼中具體實(shí)例化的地方(new處)修改了。為系統(tǒng)結(jié)構(gòu)提供靈活的動(dòng)態(tài)擴(kuò)展機(jī)制,減少了耦合。
'; } } /** * Class women 繼承people的女人類 */ class women implements people { // 具體實(shí)現(xiàn)people的say方法 public function say() { echo '我是女人
'; } } /** * Class SimpleFactoty 工廠類 */ class SimpleFactoty { // 簡(jiǎn)單工廠里的靜態(tài)方法-用于創(chuàng)建男人對(duì)象 static function createMan() { return new man(); } // 簡(jiǎn)單工廠里的靜態(tài)方法-用于創(chuàng)建女人對(duì)象 static function createWomen() { return new women(); } } /** * 具體調(diào)用 */ $man = SimpleFactoty::createMan(); $man->say(); $woman = SimpleFactoty::createWomen(); $woman->say();
單例模式
單例模式確保某個(gè)類只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。
單例模式是一種常見的設(shè)計(jì)模式,在計(jì)算機(jī)系統(tǒng)中,線程池、緩存、日志對(duì)象、對(duì)話框、打印機(jī)、數(shù)據(jù)庫(kù)操作、顯卡的驅(qū)動(dòng)程序常被設(shè)計(jì)成單例。
單例模式分3種:懶漢式單例、餓漢式單例、登記式單例。
單例模式有以下3個(gè)特點(diǎn):
1.只能有一個(gè)實(shí)例。
2.必須自行創(chuàng)建這個(gè)實(shí)例。
3.必須給其他對(duì)象提供這一實(shí)例。
那么為什么要使用PHP單例模式?
PHP一個(gè)主要應(yīng)用場(chǎng)合就是應(yīng)用程序與數(shù)據(jù)庫(kù)打交道的場(chǎng)景,在一個(gè)應(yīng)用中會(huì)存在大量的數(shù)據(jù)庫(kù)操作,針對(duì)數(shù)據(jù)庫(kù)句柄連接數(shù)據(jù)庫(kù)的行為,使用單例模式可以避免大量的new操作。因?yàn)槊恳淮蝞ew操作都會(huì)消耗系統(tǒng)和內(nèi)存的資源。
class Single { private $name;//聲明一個(gè)私有的實(shí)例變量 private function __construct(){//聲明私有構(gòu)造方法為了防止外部代碼使用new來(lái)創(chuàng)建對(duì)象。 } static public $instance;//聲明一個(gè)靜態(tài)變量(保存在類中唯一的一個(gè)實(shí)例) static public function getinstance(){//聲明一個(gè)getinstance()靜態(tài)方法,用于檢測(cè)是否有實(shí)例對(duì)象 if(!self::$instance) self::$instance = new self(); return self::$instance; } public function setname($n){ $this->name = $n; } public function getname(){ return $this->name; } } $oa = Single::getinstance(); $ob = Single::getinstance(); $oa->setname('hello world'); $ob->setname('good morning'); echo $oa->getname();//good morning echo $ob->getname();//good morning
注冊(cè)模式
注冊(cè)模式,解決全局共享和交換對(duì)象。已經(jīng)創(chuàng)建好的對(duì)象,掛在到某個(gè)全局可以使用的數(shù)組上,在需要使用的時(shí)候,直接從該數(shù)組上獲取即可。將對(duì)象注冊(cè)到全局的樹上。任何地方直接去訪問(wèn)。
適配器模式
將各種截然不同的函數(shù)接口封裝成統(tǒng)一的API。
PHP中的數(shù)據(jù)庫(kù)操作有MySQL,MySQLi,PDO三種,可以用適配器模式統(tǒng)一成一致,使不同的數(shù)據(jù)庫(kù)操作,統(tǒng)一成一樣的API。類似的場(chǎng)景還有cache適配器,可以將memcache,redis,file,apc等不同的緩存函數(shù),統(tǒng)一成一致。
首先定義一個(gè)接口(有幾個(gè)方法,以及相應(yīng)的參數(shù))。然后,有幾種不同的情況,就寫幾個(gè)類實(shí)現(xiàn)該接口。將完成相似功能的函數(shù),統(tǒng)一成一致的方法。#接口 IDatabaseMySQL
conn = $conn; } function query($sql) { $res = mysql_query($sql, $this->conn); return $res; } function close() { mysql_close($this->conn); } }MySQLi
conn = $conn; } function query($sql) { return mysqli_query($this->conn, $sql); } function close() { mysqli_close($this->conn); } }觀察者模式
1:觀察者模式(Observer),當(dāng)一個(gè)對(duì)象狀態(tài)發(fā)生變化時(shí),依賴它的對(duì)象全部會(huì)收到通知,并自動(dòng)更新。
2:場(chǎng)景:一個(gè)事件發(fā)生后,要執(zhí)行一連串更新操作。傳統(tǒng)的編程方式,就是在事件的代碼之后直接加入處理的邏輯。當(dāng)更新的邏輯增多之后,代碼會(huì)變得難以維護(hù)。這種方式是耦合的,侵入式的,增加新的邏輯需要修改事件的主體代碼。
3:觀察者模式實(shí)現(xiàn)了低耦合,非侵入式的通知與更新機(jī)制。
定義一個(gè)事件觸發(fā)抽象類。EventGenerator.php observers[]=$observer; } function notify(){ foreach ($this->observers as $observer){ $observer->update(); } } }定義一個(gè)觀察者接口
Observer.php實(shí)現(xiàn):
require 'Loader.php'; class Event extends EventGenerator{ function triger(){ echo "Event
"; } } class Observer1 implements Observer{ function update(){ echo "邏輯1
"; } } class Observer2 implements Observer{ function update(){ echo "邏輯2
"; } } $event = new Event(); $event->addObserver(new Observer1()); $event->addObserver(new Observer2()); $event->triger(); $event->notify();看完了這篇文章,相信你對(duì)常見的PHP設(shè)計(jì)模式有哪些有了一定的了解,想了解更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
網(wǎng)站名稱:常見的PHP設(shè)計(jì)模式有哪些
當(dāng)前URL:http://weahome.cn/article/jhpcdo.html