PHP應用程式中5種最常見的設計模式

2021-10-05 21:16:06 字數 4469 閱讀 9962

如果您認為第一模式是singleton,那麼您將被解雇! singleton模式已被棄用,不再需要甚至討厭。

讓我們看看這些天php世界中最常用的5種設計模式

要構建物件時,應使用工廠。 是的- 構建而不是建立 。 您不想僅僅為了建立乙個新物件就擁有乙個工廠。 構建物件時,首先建立它,然後對其進行初始化。 通常,它需要執行多個步驟並應用某些邏輯。 這樣,將所有內容都放在乙個地方並在需要以相同方式構建新物件時重新使用它就很有意義。 基本上,這就是工廠模式的重點。

最好為您的工廠提供乙個介面,並使您的**依賴於它,而不是依賴於具體的工廠。 這樣一來,您可以在需要時輕鬆地用另一家工廠替換。

接下來,我們使用以下類實現工廠介面:

inte***ce friendfactoryinte***ce

那是非常簡單但功能強大的設計模式!

它用於隱藏執行操作所需的演算法的實現細節。 有了策略,客戶可以在不知道實際實現的情況下選擇所需的演算法,並將其應用於執行操作。

假設我們需要建立乙個將資料從乙個資料來源傳輸到另乙個資料來源的庫。 例如,我們需要將資料從資料庫傳輸到csv檔案,或從電子**傳輸到json檔案。你會怎麼做?

首先,我們需要建立各自的策略以從儲存中讀取資料。 我們稱它們為readers 。 接下來,我們需要建立相應的策略以將資料寫入儲存。 我們稱他們為作家 。

因此,我們將有2位讀者從資料庫或電子**中讀取資料。 因此,我們將有2個writer將資料寫入csv檔案或json檔案。

最後,我們需要建立乙個客戶端,該客戶端將根據需要從何處以及何處傳輸資料來選擇所需的策略。

讓我們來看看所有的動作:

inte***ce readerinte***ce  

inte***ce writerinte***ce

class databasereader implements readerinte***ce

class spreadsheetreader implements readerinte***ce

class csvwriter implements writerinte***ce

class jsonwriter implements writerinte***ce

class transformer

} finally

}...

}

如您所見,作為我們策略客戶的轉換器實際上並不關心它的實現方式。 它關心的只是由我們的策略介面定義的方法。

它用於將外部介面轉換為公共介面。 假設在專案中使用以下類從某個儲存中獲取資料。

class storage  

public function getone (int $id) : ? object

public function getall (array $criteria = ) : collection

}

請注意, 儲存不能直接與源一起使用,而是可以與源介面卡一起使用。

此外,儲存對具體介面卡一無所知。 它僅指介面卡介面。 因此,提供的介面卡的具體實現對於它來說是乙個完整的黑匣子。

這是介面卡介面的示例

inte***ce adapterinte***ce

現在,假設我們使用一些庫來訪問mysql資料庫。 該庫規定了它自己的介面,它看起來如下所示:

$row = $mysql->fetchrow(...);

$data = $mysql->fetchall(...);

如您所見,我們不能像把它那樣整合到我們的torage中 。 我們需要為其建立乙個介面卡,如下所示:

class mysqladapter implements adapterinte***ce  

public function findall (array $criteria = ) : collection

...}

之後,我們可以將其注入到儲存中 ,如下所示:

$storage = new storage( new mysqladapter($mysql));

如果以後我們決定使用另乙個庫來代替該庫,則只需像上面一樣為該庫建立另乙個介面卡,然後將新介面卡注入到storage中 。 如您所見,為了使用其他庫從資料庫中獲取資料,我們不需要在storage類中進行任何操作。 這就是介面卡設計模式的強大功能!

它用於在特定位置將有關某些事件的資訊通知系統的其餘部分。 為了更好地了解這種模式的好處,讓我們回顧一下同一問題的兩種解決方案。

讓我們看一下**中的樣子:

class theater  

}

它看起來乾淨而且很有前途。

好吧,這裡的問題之一是為了實現這一點,我們需要修改theatre類,這違反了solid原則。 特別是它破壞了開啟/關閉

原則。 而且,這種方法將使戲劇課依賴於一些不好的附加服務。

如果我們把事情顛倒了怎麼辦。 與其給劇院類增加越來越多的複雜性和依賴性,我們不如將其複雜性分散到整個系統中,從而減少了劇院類的依賴性作為獎勵。

這是實際的樣子:

class theater  

}$theater = new theater();

$theater

->geteventmanager()

->listen(event::start, new messageslistener())

->listen(event::start, new lightslistener())

->listen(event::pause, new breaklistener())

->listen(event::pause, new advertisementlistener())

->listen(event::end, new feedbacklistener())

->listen(event::end, new cleaninglistener());

$theater->present($movie);

正如你所看到的, 本方法變得非常簡單。 它不在乎課外會發生什麼。 它只執行應做的事情,並將事實通知系統的其餘部分。 對這些事實感興趣的人,都可以收聽相應的事件並得到有關它們的通知,並採取相應措施。

使用這種方法,新增其他複雜性也變得非常容易。 您要做的就是建立乙個新的偵聽器,並將所需的邏輯放在這裡。

希望您發現觀察者模式有用。

當您要在執行時調整物件的行為時使用它,從而減少冗餘繼承和類數。 您可能會問為什麼我完全需要它? 好吧,用示例可以更好地解釋它。

假設我們有window和door類,它們都實現openerinte***ce

inte***ce openerinte***ce  

class door implements openerinte***ce

}class window implements openerinte***ce

}

窗戶和門的開啟行為相同。 現在,我們需要其他門窗

用的附加功能,將告訴使用者外面的溫度 ,當他們開啟

車門或車窗 。 我們可以通過繼承來解決此問題,如下所示:

class smartdoor extends door  

}class smartwindow extends window

}

到目前為止,總共共有4個課程。 但是,使用decorator模式,我們只能使用3個類來解決此問題。 就是這樣:

class smartopener implements openerinte***ce   

public function open () : void

}$door = new door();

$window = new window();

$smartdoor = new smartopener($door);

$smartwindow = new smartopener($window);

我們引入了一種新型的開啟器 ,其作用類似於**,但其上還具有其他功能。 這就是竅門。

如果您在任何型別的開發專案中需要幫助,我也可以為您提供有關專案的諮詢。我是最受好評的自由職業者。您可以直接在

upwork

上雇用我你也可以

雇用我自由職業者

iOS應用程式5種常見的儲存方式

xml 屬性列表 plist 歸檔 儲存 獲取應用沙盒路徑 nsstring homepath nshomedirectory nslog homepath 獲取caches資料夾路徑 directory 搜尋資料夾 domainmask 在哪個範圍內搜尋 nsuserdomainmask 在使用者...

5種最常見的http錯誤

對對http 500錯誤的定義已經充分證明了這是乙個最常見的http錯誤。一般來說,http 500 錯誤就是web伺服器發生內部錯誤時返回的資訊。例如,web伺服器過載時將無法正確處理訪問請求。根據google的搜尋資料統計,http 500 錯誤發生機率是404錯誤的兩倍 大多數人都知道這個錯誤...

常見的應用程式模式

b 容器模式 b container pattern 用於具有類似外掛程式結構的應用,對眾多小型實用性的應用程式提供支援。b 聚合器模式 b aggregator pattern 用於將通常沒有聯絡的資料組合到乙個介面中的應用程式。b 工作區模式 b workspace pattern 用於提供乙個...