<一覧に戻る

ビジターパターン

ビジターパターンは、オブジェクトの構造を変更せずに新しい操作を追加するための行動デザインパターンです。このパターンを使用すると、異なるクラスのオブジェクトに対して共通の操作を定義し、それを実行することができます。

ビジターパターンの構成要素

ビジターパターンは主に以下の構成要素から成り立っています。

  1. Visitor: ビジターインターフェース。具体的なビジターが実装するメソッドを定義します。
  2. ConcreteVisitor: ビジターの具体的な実装。訪問するオブジェクトに対する操作を定義します。
  3. Element: 要素インターフェース。ビジットされるオブジェクトを表します。
  4. ConcreteElement: 要素の具体的な実装。ビジターからの操作を受け入れます。
  5. ObjectStructure: 要素を管理する構造体。ビジターを受け入れるメソッドを持ちます。

サンプルコード

以下に、ビジターパターンを用いた簡単な例を示します。この例では、異なるタイプの動物(犬と猫)に対して、食事の方法を訪問するビジターを実装します。

ステップ1: Visitorインターフェースの定義

まず、ビジターインターフェースを定義します。

class AnimalVisitor:
    def visit_dog(self, dog):
        pass

    def visit_cat(self, cat):
        pass

ステップ2: Elementインターフェースの定義

次に、要素インターフェースを定義します。

class Animal:
    def accept(self, visitor):
        pass

ステップ3: ConcreteElementの実装

犬と猫の具体的な要素を実装します。

class Dog(Animal):
    def accept(self, visitor):
        visitor.visit_dog(self)

    def bark(self):
        return "Woof!"

class Cat(Animal):
    def accept(self, visitor):
        visitor.visit_cat(self)

    def meow(self):
        return "Meow!"

ステップ4: ConcreteVisitorの実装

次に、動物に対して食事の方法を訪問するビジターを実装します。

class FeedingVisitor(AnimalVisitor):
    def visit_dog(self, dog):
        print("Feeding the dog: " + dog.bark())

    def visit_cat(self, cat):
        print("Feeding the cat: " + cat.meow())

ステップ5: ObjectStructureの実装

最後に、動物を管理するオブジェクト構造体を定義します。

class AnimalShelter:
    def __init__(self):
        self.animals = []

    def add_animal(self, animal):
        self.animals.append(animal)

    def feed_animals(self, visitor):
        for animal in self.animals:
            animal.accept(visitor)

ステップ6: コードの実行

すべての構成要素が整ったので、実際にビジターパターンを使用して動物に食事を与える例を見てみましょう。

if __name__ == "__main__":
    shelter = AnimalShelter()
    shelter.add_animal(Dog())
    shelter.add_animal(Cat())

    feeding_visitor = FeedingVisitor()
    shelter.feed_animals(feeding_visitor)

サンプルコードの解説

  1. Visitorインターフェース: AnimalVisitorは、動物に対する訪問操作を定義しています。このインターフェースを実装することで、さまざまな訪問者を作成できます。

  2. Elementインターフェース: Animalは、動物がビジターを受け入れるためのインターフェースです。具体的な動物はこのインターフェースを実装し、ビジターを受け入れるメソッドを提供します。

  3. ConcreteElement: DogCatは、具体的な動物クラスであり、それぞれの動物特有の動作(吠える、鳴く)を持っています。

  4. ConcreteVisitor: FeedingVisitorは、動物に食事を与える操作を実装しています。各動物に対して異なる処理を行うことができます。

  5. ObjectStructure: AnimalShelterは、動物のリストを管理し、ビジターを使用して動物に対する操作を実行します。

このように、ビジターパターンを使用することで、オブジェクトの構造を変更することなく、新しい操作を追加することができます。このパターンは、特に複雑なオブジェクト構造を扱う場合に役立ちます。

出力結果: