訪問者模式(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;
public function visitConcreteElementB(ConcreteElementB $elementB): void;
}
// 具體訪問者
class ConcreteVisitor implements Visitor {
public function visitConcreteElementA(ConcreteElementA $elementA): void {
echo $elementA->operationA() . PHP_EOL;
}
public function visitConcreteElementB(ConcreteElementB $elementB): void {
echo $elementB->operationB() . PHP_EOL;
}
}
// 使用範例
$elements = [new ConcreteElementA(), new ConcreteElementB()];
$visitor = new ConcreteVisitor();
foreach ($elements as $element) {
$element->accept($visitor);
}
在這個例子中,我們首先定義了一個元素接口 `Element`,並實作了兩個具體元素類別 `ConcreteElementA` 和 `ConcreteElementB`。每個具體元素都實現了 `accept` 方法,用於接受訪問者的訪問。
接著,我們定義了一個訪問者接口 `Visitor`,其中定義了訪問每個具體元素的方法。
然後,我們實作了具體訪問者 `ConcreteVisitor`,並在每個訪問方法中定義了對具體元素的操作。
最後,我們創建了具體元素的陣列 `$elements`,並創建了一個具體訪問者 `$visitor`。在遍歷每個元素時,我們呼叫元素的 `accept` 方法並傳遞訪問者,從而執行相應的操作。
透過訪問者模式,我們可以在不修改元素類別的情況下,定義新的操作。訪問者模式適用於元素結構相對穩定,但需要定義多個不同操作的情況下。它提供了一種彈性的方式來新增操作,同時保持元素類別的封裝性。
留言
張貼留言