🐵

Visitor

2023/09/10に公開

Visitor パターンは、オブジェクトの構造からアルゴリズムを分離することで、構造が変更されない限り、新しい操作を追加できるようにするデザインパターンです。このパターンは、構造内の各要素に対して訪問者が実行する操作を表すことができる Visitor クラスを使用します。

主要な構成要素:

  1. Visitor (訪問者): 具体的な訪問者を表すクラスまたはインターフェース。
  2. ConcreteVisitor (具体的な訪問者): 特定のアルゴリズムを実行するためのVisitorの具体的な実装。
  3. Element (要素): Visitor クラスが訪問する要素のインターフェース。
  4. ConcreteElement (具体的な要素): Elementインターフェースを実装する具体的なクラス。

例:

コンピュータの部品を訪れて詳細を表示するシステムを考えてみましょう。

  1. Element:

    from abc import ABC, abstractmethod
    
    class ComputerPart(ABC):
        @abstractmethod
        def accept(self, visitor):
            pass
    
    
  2. ConcreteElement:

    class Keyboard(ComputerPart):
        def accept(self, visitor):
            visitor.visit_keyboard(self)
    
    class Monitor(ComputerPart):
        def accept(self, visitor):
            visitor.visit_monitor(self)
    
    
  3. Visitor:

    from abc import ABC, abstractmethod
    
    class ComputerPartVisitor(ABC):
        @abstractmethod
        def visit_keyboard(self, keyboard):
            pass
    
        @abstractmethod
        def visit_monitor(self, monitor):
            pass
    
    
  4. ConcreteVisitor:

    class ComputerPartDisplayVisitor(ComputerPartVisitor):
        def visit_keyboard(self, keyboard):
            print("Displaying Keyboard.")
    
        def visit_monitor(self, monitor):
            print("Displaying Monitor.")
    
    

使用方法:

    keyboard = Keyboard()
    monitor = Monitor()

    display_visitor = ComputerPartDisplayVisitor()

    keyboard.accept(display_visitor)
    monitor.accept(display_visitor)

出力:

Displaying Keyboard.
Displaying Monitor.

利点:

  1. 拡張性: 新しい操作を追加することが容易であり、オブジェクトの構造やそのクラスを変更することなく新しい機能を追加できます。
  2. 単一責任の原則: 各操作はVisitorクラス内で定義されており、それによって機能の分離が促進されます。
  3. 集約: 類似の操作を1つのクラスに集約できるため、コードの重複を防ぐことができます。

Visitor パターンは、オブジェクトの構造とアルゴリズムを分離することで、オブジェクトの構造を変更せずに新しい操作を追加したい場合に特に有用です。

Discussion