ビジターパターンは、オブジェクトの構造を変更せずに新しい操作を追加するための行動デザインパターンです。このパターンを使用すると、異なるクラスのオブジェクトに対して共通の操作を定義し、それを実行することができます。
ビジターパターンは主に以下の構成要素から成り立っています。
以下に、ビジターパターンを用いた簡単な例を示します。この例では、異なるタイプの動物(犬と猫)に対して、食事の方法を訪問するビジターを実装します。
まず、ビジターインターフェースを定義します。
class AnimalVisitor:
def visit_dog(self, dog):
pass
def visit_cat(self, cat):
pass
次に、要素インターフェースを定義します。
class Animal:
def accept(self, visitor):
pass
犬と猫の具体的な要素を実装します。
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!"
次に、動物に対して食事の方法を訪問するビジターを実装します。
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())
最後に、動物を管理するオブジェクト構造体を定義します。
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)
すべての構成要素が整ったので、実際にビジターパターンを使用して動物に食事を与える例を見てみましょう。
if __name__ == "__main__":
shelter = AnimalShelter()
shelter.add_animal(Dog())
shelter.add_animal(Cat())
feeding_visitor = FeedingVisitor()
shelter.feed_animals(feeding_visitor)
Visitorインターフェース: AnimalVisitor
は、動物に対する訪問操作を定義しています。このインターフェースを実装することで、さまざまな訪問者を作成できます。
Elementインターフェース: Animal
は、動物がビジターを受け入れるためのインターフェースです。具体的な動物はこのインターフェースを実装し、ビジターを受け入れるメソッドを提供します。
ConcreteElement: Dog
とCat
は、具体的な動物クラスであり、それぞれの動物特有の動作(吠える、鳴く)を持っています。
ConcreteVisitor: FeedingVisitor
は、動物に食事を与える操作を実装しています。各動物に対して異なる処理を行うことができます。
ObjectStructure: AnimalShelter
は、動物のリストを管理し、ビジターを使用して動物に対する操作を実行します。
このように、ビジターパターンを使用することで、オブジェクトの構造を変更することなく、新しい操作を追加することができます。このパターンは、特に複雑なオブジェクト構造を扱う場合に役立ちます。