【PHP 設計模式】修飾模式 Decorator Pattern
修飾模式 Decorator Pattern修飾模式,或者稱裝飾者模式,為物件動態增加新的方法,就想像你最初的大頭菜沒有想過他會壞掉,某天突然覺得讓大頭菜壞掉好像很好玩,但你不能把整個大頭菜砍掉重練,所以你希望可以不改變既有的大頭菜,在大頭菜額外再套上新的功能,那就是壞掉。
UML
實作首先我們會需要定義出最初始大頭菜的介面,以及其最初的功能。
TurnipsInterface.php
1234567/** * Interface TurnipsInterface. */interface TurnipsInterface{ public function calculatePrice(): int;}
TurnipsService.php
1234567891011121314151617181920212223242526272829303132333435/** * Class TurnipsService. */class TurnipsService implements TurnipsInterface{ /** * @v ...
【PHP 設計模式】資料對應 Data Mapper
資料對應 Data Mapper資料對應,這是一種常用於處理物件導向與資料庫資料的模式,與 Repository 不同,Data Mapper 主要處理的事單個物件本身,而 Repository 處理的是物件的集合。這次實作舉個例子,你在買大頭菜之前,需要有一個草圖去評估你要前往哪些島上買大頭菜,決定好之後再開始行動。
UML
實作首先我們要先把大頭菜給實作出來,這次因為大頭菜可以來自不同的島嶼,因此多了島嶼名稱,以及透過 new self(...) 的方式來回傳新的大頭菜物件。
Turnips.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748/** * Class Turnips. */class Turnips{ /** * @var string */ protected $island; /** * @var int */ protected $price; /** ...
【PHP 設計模式】組合模式 Composite Pattern
組合模式 Composite Pattern組合模式,一種將物件一個一個處理,並且最後組合起來的模式,可以想像剛買到大頭菜時的夢想,經過每次漲跌所帶來的希望與絕望,究竟是充滿絕望的遞減型呢?還是致富關鍵的三期型呢?每次的價格異動,都代表著價格物件,最終賣出的鈴錢價格,是經過許多鈴錢價格物件所算出來的。
UML
實作首先我們要先定義組合介面,用來套用在每個功能物件上。
TurnipsInterface.php
1234567/** * Interface TurnipsInterface. */interface TurnipsInterface{ public function calculatePrice(): int;}
再來建立大頭菜上漲(Price up)以及下跌(Price down)的物件,並且套用介面 Interface,其功能是把漲跌幅丟進去,用來紀錄當次的漲跌幅。
PriceUp.php
12345678910111213141516171819202122232425262728/** * Class PriceUp. */class P ...
【PHP 設計模式】橋接模式 Bridge Pattern
橋接模式 Bridge Pattern橋接模式,將實作體系與抽象體系分離開來,讓兩者能各自更動各自演進,就有點像是大頭菜有分健康的大頭菜及壞掉的大頭菜,你的島上有這兩種大頭菜,但是健康的大頭菜過了一個禮拜都沒賣掉的話,他就會變成壞掉的大頭菜了。
UML
實作首先我們要來把大頭菜做出來,因此會有定義大頭菜介面 Interface、建立健康的大頭菜及壞掉的大頭菜。
TurnipsInterface.php
1234567/** * Interface TurnipsInterface. */interface TurnipsInterface{ public function calculatePrice(): int;}
Turnips.php
123456789101112131415161718192021222324252627282930313233343536373839/** * Class Turnips. */class Turnips implements TurnipsInterface{ /** * @var in ...
【PHP 設計模式】轉接器模式 Adapter Pattern
轉接器模式 Adapter Pattern轉接器模式,顧名思義會在兩個同功能但不同的規格的東西中,當作中間溝通的橋樑,就有點像是健康的大頭菜因為放超過一個禮拜,直接變成壞掉的大頭菜,兩個東西都是大頭菜,但規格上可能不太一樣,這時候我們就需要一個大頭菜轉接器,直接把健康的大頭菜給轉到壞掉。
UML
實作首先我們需要先建立健康的大頭菜、以及壞掉的大頭菜,別忘記要建立介面(Interface)來定義大頭菜的規格。
TurnipsInterface.php
1234567891011121314151617181920212223/** * Interface TurnipsInterface. */interface TurnipsInterface{ public function risePrice(int $price): int; public function fallPrice(int $price): int; public function getPrice(): int; public function setPrice(int $pric ...
【PHP 設計模式】物件池模式 Pool Pattern
物件池模式 Pool Pattern物件池模式,每次的買賣都是致富的關鍵,致富不能只靠 40 顆大頭菜,靠的是放滿整座島的大頭菜,因此你需要有個島專門放大頭菜,放得滿滿的,到了關鍵時刻再把大頭菜拿出來賣。
UML
實作首先我們會需要把大頭菜定義出來,並且賦予幾些簡單的功能。
Turnips.php
123456789101112131415161718192021222324252627282930313233343536373839/** * Class Turnips. */class Turnips{ /** * @var int */ protected $price; /** * @var int */ protected $count; /** * Turnips constructor. * * @param int $price * @param int $count */ public function __construct(int $price, ...
【PHP 設計模式】建造者模式 Builder Pattern
建造者模式 Builder Pattern建造者模式,主要用來建立複雜的物件,就有點像是大頭菜的功能組成,從鈴錢價格、組合數量、現場實價 ... 等等,為了簡化把每個功能都去不斷地建立物件、塞入物件的動作,因此可以指派一個建造者,並且賦予建造模式,然後透過指定的方法來建造物件,你不需要歷經繁瑣的過程,就能獲得擁有複雜功能的物件。
UML
實作在寫建造者之前,我們需要先把很複雜的大頭菜給做出來,為了把大頭菜變複雜,所以把價格(Price)以及數量(Count)抽離出來做成物件。
Price.php
123456789101112131415161718192021222324252627282930313233343536/** * Class Price. */class Price{ /** * @var int */ protected int $price = 0; /** * Price constructor. * * @param int $price */ public function ...
【PHP 設計模式】原型模式 Prototype Pattern
原型模式 Prototype Pattern原型模式,你有些物件可能會需要建立很多一樣的物件,只是某些資料不太一樣而已,就有點像是每顆大頭菜都是一模一樣的物件,但可能因為來自不同的島,所以每顆大頭菜的差別只在於那起始購買的鈴錢不同。
UML
實作首先我們需要以抽象類別的方式,來製作大頭菜的原型,並且定義好大頭菜的基本功能。
TurnipsPrototype.php
12345678910111213141516171819202122232425262728293031323334/** * Class TurnipsPrototype. */abstract class TurnipsPrototype{ /** * @var string */ protected $category; /** * @var int */ protected $price; /** * @var int */ protected $count; abstract public function __c ...
【PHP 設計模式】工廠方法 Factory Method
工廠方法 Factory Method工廠方法,跟抽象工廠有點像,可是又沒那麼像,抽象工廠的工廠會有個抽象類別,並且把工廠要做且會重工的事情寫在抽象類別當中,而工廠方法則是需要定義一個工廠介面,並且讓工廠去實作,如果看到工廠介面不小心定義成抽象工廠,就拿網子打他,有點像是曹賣的奶奶會賣大頭菜,曹賣也會賣大頭菜,所以他們都有一個介面定義他們會賣大頭菜。
UML
實作首先我們一樣要先建立大頭菜介面,並且定義大頭菜需要有哪些功能,再來建立健康的大頭菜、壞掉的大頭菜,先有大頭菜才有大頭菜工廠。
TurnipsContract.php
1234567/** * Interface TurnipsContract. */interface TurnipsContract{ public function calculatePrice(): int;}
然後我們要新增新鮮的大頭菜、壞掉的大頭菜,並且去實作大頭菜介面所定義的條件。
Turnips.php
123456789101112131415161718192021222324252627282930313233343 ...
【PHP 設計模式】靜態工廠 Abstract Factory
抽象工廠 Abstract Factory抽象工廠,跟靜態工廠有點像,只是它沒那麼靜態,你需要先把工廠建立出來,才能開始生產大頭菜,就有點像是星期日的早上時,你打開 Switch 需要先看西施惠晨報,這時候島上正在把曹賣叫過來,你聽完晨報時,曹賣也到島上了。
【補充說明】工廠主要在於說,如果你有一個物件需要建立,並且你會附帶很多功能時,為了避免耦合性過高,因而擁有的一系列模式。你如果已經讀過前面幾些工廠的話,那你會發現工廠不外乎就是會有一個主要物件,以及負責建立物件的工廠,對於呼叫端來說,工廠怎麼製作這些物件的,這並不重要,因為呼叫端只需要給定參數,工廠的職責就是將物件生出來,在抽象工廠當中,工廠與工廠之間可能有會重複的功能,但又有片面不重複的功能。舉個例子來講,今天你在開發一個串接社群網站的應用程式,你有個功能是希望將文章一次發佈到多個社群網站,那麼當你在把文章發表到社群網站時,你可能會需要有個 Facebook 套件、Plurk 套件、Twitter 套件之類的,建立他們的方式可能不太一樣,有的吃 token,有的則是要 oauth 流程,但目標都是獲得特定社群的 client ...