【PHP 設計模式】中介者模式 Mediator Pattern
中介者模式 Mediator Pattern中介者模式,在兩個不同的封裝物件之間,作為中間進行交互的模式,可以減少物件之間的依賴關係,並且降低耦合性問題,舉例來說有背包(Bag)與商店(Store)這兩個物件,你會從背包(Bag)當中拿出鈴錢(Bells)去商店(Store)購買大頭菜(Turnips),但它們應該要各自其職,不要太過於互相依賴,因此你會需要有個中間控制這些物件的中介者(Mediator)。
UML
實作首先我們不外乎先製作出大頭菜(Turnips)物件,只需要賦予簡單計算數量的功能即可。
Turnips.php
123456789101112131415161718192021222324252627282930313233343536/** * Turnips */class Turnips{ /** * @var int */ protected int $count; /** * Turnips constructor. * * @param int $count */ publ ...
【PHP 設計模式】疊代器模式 Iterator Pattern
疊代器模式 Iterator Pattern疊代器模式,提供一種方法來簡單控制一個集合物件,這段過程並不會暴露該物件的來源或修改它,就有點像是你的背包(Bag)一樣,疊代器(Iterator)可以簡單控制你背包中的大頭菜(Turnips)以及鈴錢(Bells)。
UML
實作首先我們一樣要先建立大頭菜物件(Turnips),並且賦予一些簡單方法,像是島嶼(Island)、鈴錢價格(Price)及數量(Count),並且提供簡單的取得(get)及賦予(set)方法。
Turnips.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990/** * Class Turnips. */class Turnips{ /** * @var string */ prot ...
【PHP 設計模式】命令模式 Command Pattern
命令模式 Command Pattern命令模式,是一種將行為封裝起來裹上美好糖衣的一種模式,並將接收與執行分離出來,就有點像是把大頭菜買賣這件事,如果把買大頭菜、賣大頭菜這兩個動作封裝起來,變成一個命令,分開去執行。
UML
實作首先我們要先定義命令介面(Command),這個介面需要實作執行(execute)這個方法。
Command.php
12345678910/** * Interface Command. */interface Command{ /** * @return void */ public function execute();}
再來我們需要建立命令的執行者(Invoker)、接收者(Receiver),首先執行者會擁有執行命令(Command)的行為,而接收者則是會有特定的功能,像是買入大頭菜、販售大頭菜。
Invoker.php
1234567891011121314151617181920212223242526/** * Class Invoker. */class Invoker{ ...
【PHP 設計模式】責任鏈模式 Chain of Responsibilities
責任鏈模式 Chain of Responsibilities責任鏈模式,有一系列的命令物件及處理物件,常見於需要被連續處理的地方上,舉例來說,假設今天收購箱、商店收購大頭菜時,多了一些條件,你必須先把大頭菜拿去收購箱收購,並且收購箱子會有鈴錢價格打 8 折的情形,剩下有多餘的大頭菜才能拿去給商店收購。
UML
實作首先我們要先把背包(Bag)、大頭菜(Turnips)這兩個東西給實作出來,先從大頭菜開始,一樣建立簡單的鈴錢、數量以及獲取賦予方法。
Turnips.php
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859/** * Class Turnips. */class Turnips{ /** * @var int */ protected int $price; /** * @var int */ protected int $count; ...
【PHP 設計模式】註冊模式 Registry Pattern
註冊模式 Registry Pattern註冊模式,如果應用程式內有非常多同樣的物件需要高度重複讀寫,就會去建立一個儲存器來負責管理這些同樣的物件,就有點像是你的大頭菜,會來自不同的島,每座的島菜價不同,這會導致你很難算出所賺到的鈴錢,所以如果每個大頭菜都需要登記註冊,然後有個集中管理的名冊,在管理大頭菜這件事上就能比較輕鬆。
UML
實作首先我們會先建立需要被集中管理的大頭菜物件,裡面提供了簡單的幾些方法,例如賦予獲得島嶼名稱、鈴錢以及數量。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182/** * Class Turnips. */class Turnips{ /** * @var string */ public string $island; /** * @var i ...
【PHP 設計模式】代理模式 Proxy Pattern
代理模式 Proxy Pattern代理模式,它可以作為需要被保護的物件的介面,若以檔案權限來比喻的話,就是對主要物件套上一層代理,你可以在代理上實作控制權限,像是其代理僅有讀取、執行的權限,並沒有刪除、修改的權限,並防止直接接觸實際物件,換作大頭菜來講的話,大頭菜的本質就是大頭菜,大頭菜就頂多提供數量堆積的功能,鈴錢的計算要在代理介面上實作。
UML
實作所以我們要先來實作大頭菜介面,並且僅提供大頭菜總數計算的功能。
TurnipsInterface.php
123456789101112131415/** * Interface TurnipsInterface. */interface TurnipsInterface{ /** * @param int $count */ public function setCount(int $count); /** * @return int */ public function getCount(): int;}
Turnips.php
12345678910 ...
【PHP 設計模式】享元模式 Flyweight Pattern
享元模式 Flyweight Pattern享元模式,在定義上來說是共享物件,將相似的物件集中整理,減少記憶體上的使用,舉例來說每座島的大頭菜鈴錢價格都不同,有些朋友會送你大頭菜,但因為朋友太多了,所以需要有個地方集中放這些大頭菜,並且記錄起來,每個朋友都送你一組大頭彩,但你不能重複紀錄,不然你只收到一組大頭菜,帳上卻紀錄兩組,這樣就不好了。
UML
實作首先我們須要先定義大頭菜作為共享目標,紀錄了島嶼、鈴錢以及數量,並且提供了簡單的計算總價方法。
FlyweightInterface.php
12345678910/** * Interface FlyweightInterface. */interface FlyweightInterface{ /** * @return int */ public function calculatePrice(): int;}
12345678910111213141516171819202122232425262728293031323334353637383940/** * Class Tu ...
【PHP 設計模式】流暢介面 Fluent Interface
流暢介面 Fluent Interface流暢介面,常用於撰寫如同文章般容易閱讀的程式碼,如果以大頭菜來講,那麼在建立大頭菜的同時,希望可以順便賦予其鈴錢價格、數量,並且最終獲得的依舊是大頭菜物件。
UML
實作這次只需要實作一個大頭菜物件,其精隨在於賦予鈴錢價格、數量時,最後會將整個物件再回傳出來,透過被呼叫的方法來回傳當前物件。
Turnips.php
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647/** * Class Turnips. */class Turnips{ /** * @var int */ protected $price = 0; /** * @var int */ protected $count = 0; /** * @param int $price * * @return Turnips */ public functio ...
【PHP 設計模式】外觀模式 Facade Pattern
外觀模式 Facade Pattern外觀模式,或者稱作門面模式,一種把複雜邏輯給包裝起來的一種模式,舉個例子來說,今天已經不單只是計算大頭菜了,而是你有個背包(Bag)要先放入鈴錢(Bells),然後拿出鈴錢從曹賣(DaisyMae)手中購買大頭菜,並且把大頭菜賣給 Nook 商店(Store),牽涉到許多的細節,透過外觀模式來將複雜的操作集中成幾個簡單的動作。
UML
實作首先我們先慣例定義一下主角大頭菜(Turnips),在這邊只需要給予價格、數量即可。
Turnips.php
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859/** * Class Turnips */class Turnips{ /** * @var int */ protected $price; /** * @var int */ protected $count; / ...
【PHP 設計模式】依賴注入 Dependency Injection
依賴注入 Dependency Injection依賴注入模式,是控制反轉(Inversion of Control,縮寫為IoC)的一種實作方式,主要是將依賴物件丟給接收物件中,就像是你想要用大頭菜發財致富,但大頭菜有那麼多顆,你不可能每顆都記住鈴錢單價、數量,所以你寫了一張便條紙,紀錄著大頭菜的類別、鈴錢單價、數量,然後貼在大頭菜上。
UML
實作首先為了讓我們的大頭菜有個便條紙,所以我們要先建立大頭菜的組態文件 TrunipsConfiguration 並且將型別、鈴錢單價及數量帶入進去,為了防止外部物件直接碰到設定,所以需要獨立出 get 方法。
TurnipsConfiguration.php
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071/** * Class TurnipsConfiguration. */class TurnipsConfiguratio ...