訪問者模式(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` 方法並傳遞訪問者,從而執行相應的操作。


透過訪問者模式,我們可以在不修改元素類別的情況下,定義新的操作。訪問者模式適用於元素結構相對穩定,但需要定義多個不同操作的情況下。它提供了一種彈性的方式來新增操作,同時保持元素類別的封裝性。

留言

這個網誌中的熱門文章

bcb C++ Builder無法讀取JPG

tesseract is not installed or it's not in your path

tensorflow gpu版本 安裝教學 window 10 python 3.6