發表文章

目前顯示的是 6月, 2023的文章

訪問者模式(Visitor Pattern)以PHP為例

訪問者模式(Visitor Pattern)是一種行為型設計模式,它用於將操作從元素的結構中分離出來。這種模式可以讓我們在不修改元素類別的情況下,定義新的操作。 以下是一個使用 PHP 語言的訪問者模式重構案例: // 元素接口 interface Element {     public function accept(Visitor $visitor): void; } // 具體元素 A class ConcreteElementA implements Element {     public function accept(Visitor $visitor): void {         $visitor->visitConcreteElementA($this);     }     public function operationA(): string {         return "ConcreteElementA: Operation A";     } } // 具體元素 B class ConcreteElementB implements Element {     public function accept(Visitor $visitor): void {         $visitor->visitConcreteElementB($this);     }     public function operationB(): string {         return "ConcreteElementB: Operation B";     } } // 訪問者接口 interface Visitor {     public function visitConcreteElementA(ConcreteElementA $elementA): void; ...

橋樑模式(Bridge Pattern)以PHP為例

橋樑模式(Bridge Pattern)是一種結構型設計模式,它將抽象和實作分離,使它們可以獨立變化。這種模式通常用於將類別的抽象部分與其實作部分分離,並且可以獨立地擴展和修改它們。 以下是一個使用 PHP 語言的橋樑模式重構案例: // 實作部分的介面 interface Implementation {     public function operationImplementation(): string; } // 具體的實作部分 A class ConcreteImplementationA implements Implementation {     public function operationImplementation(): string {         return "ConcreteImplementationA";     } } // 具體的實作部分 B class ConcreteImplementationB implements Implementation {     public function operationImplementation(): string {         return "ConcreteImplementationB";     } } // 抽象部分的類別 abstract class Abstraction {     protected $implementation;     public function __construct(Implementation $implementation) {         $this->implementation = $implementation;     }     public function operation(): string {         return "Abstraction:...

狀態模式(State Pattern) 以PHP為例

 狀態模式(State Pattern)是一種行為型設計模式,它允許物件在內部狀態發生變化時改變其行為。這種模式將物件的行為封裝在不同的狀態類別中,使得物件能夠根據當前的狀態選擇不同的行為。 以下是一個使用 PHP 實現狀態模式的重構案例: / / Context(上下文)類別維護著當前狀態物件並委派相關的請求給該狀態物件 class Context {     private $state;     public function __construct(State $state) {         $this->state = $state;     }     public function setState(State $state) {         $this->state = $state;     }     public function request() {         $this->state->handle($this);     } } // State(狀態)介面聲明了具體狀態類別應實現的方法 interface State {     public function handle(Context $context): void; } // ConcreteStateA(具體狀態A)實現 State 介面並提供具體的行為 class ConcreteStateA implements State {     public function handle(Context $context): void {         echo "ConcreteStateA: Handle\n";         // 狀態轉換         $context->setState(new C...

原型模式(Prototype Pattern) 以PHP為例

 原型模式(Prototype Pattern)是一種創建型設計模式,它通過複製現有物件來生成新物件,而不需要使用者知道具體的創建邏輯。這種模式通常用於當創建物件的成本很高昂或複雜時,並且希望通過複製現有物件來獲得新物件。 下面是一個使用 PHP 實現原型模式的重構案例: abstract class Prototype {     protected $name;     public function __construct($name) {         $this->name = $name;     }     abstract public function clone(): Prototype;     public function getName() {         return $this->name;     } } class ConcretePrototype extends Prototype {     public function clone(): Prototype {         return new ConcretePrototype($this->getName());     } } // 使用範例 $prototype = new ConcretePrototype('Prototype'); $clone = $prototype->clone(); echo $prototype->getName();  // Output: Prototype echo $clone->getName();  // Output: Prototype 在這個例子中,我們首先定義了一個抽象類別 `Prototype`,它包含一個抽象方法 `clone` 和一個共享的屬性 `name`。 `clone` 方法用於生成該物件的克隆,子類別必須實現這個方法。 `getName` 方法用於獲取...

輕量級模式(Flyweight Pattern) 以PHP為例

輕量級模式(Flyweight Pattern)是一種結構型設計模式,它旨在有效地支援大量細粒度的物件共享,以減少記憶體使用和提高效能。該模式通常在應用程式需要使用大量相似物件時使用。 以下是一個使用 PHP 實現輕量級模式的案例: // Flyweight(輕量物件)介面定義了共享物件的操作 interface Flyweight {     public function operation(): void; } // ConcreteFlyweight(具體輕量物件)實現 Flyweight 介面,並代表可共享的物件 class ConcreteFlyweight implements Flyweight {     private $name;     public function __construct($name) {         $this->name = $name;     }     public function operation(): void {         echo "ConcreteFlyweight: {$this->name}\n";     } } // FlyweightFactory(輕量工廠)負責創建和管理共享的輕量物件 class FlyweightFactory {     private $flyweights = [];     public function getFlyweight($name): Flyweight {         if (!isset($this->flyweights[$name])) {             $this->flyweights[$name] = new ConcreteFlyweight($name);         }     ...

單一職責原則 (Single Responsibility Principle,SRP) 以PHP為例

單一職責原則(Single Responsibility Principle,SRP)是一個軟體設計原則,它指出一個類別應該只有一個引起變化的原因。換句話說,一個類別應該只負責一個職責或功能。 以下是一個使用 PHP 進行單一職責原則重構的範例: class FileLogger {     private $filename;     public function __construct($filename) {         $this->filename = $filename;     }     public function log($message) {         file_put_contents($this->filename, $message, FILE_APPEND);     }     public function clearLog() {         file_put_contents($this->filename, '');     } } class User {     private $name;     private $logger;     public function __construct($name, FileLogger $logger) {         $this->name = $name;         $this->logger = $logger;     }     public function setName($name) {         $this->name = $name;         $this->logge...

依賴反轉原則(Dependency Inversion Principle, DIP) 以PHP為例

當我們談論依賴反轉原則(Dependency Inversion Principle,DIP)時,我們講的是高階模組(High-level Modules)不應該依賴於低階模組(Low-level Modules),兩者都應該依賴於抽象(Abstractions)。 下面是一個簡單的例子,展示如何使用 PHP 實現依賴反轉原則: interface MessageSenderInterface {     public function sendMessage($message); } class EmailSender implements MessageSenderInterface {     public function sendMessage($message) {         // 實現發送電子郵件的邏輯         echo "Sending email: " . $message . "\n";     } } class SMSsender implements MessageSenderInterface {     public function sendMessage($message) {         // 實現發送短信的邏輯         echo "Sending SMS: " . $message . "\n";     } } class NotificationService {     private $messageSender;     public function __construct(MessageSenderInterface $messageSender) {         $this->messageSender = $messageSender;     }     public function sendNoti...