2b)機能の実現:ConcreteVisitor

Visitor::ConcreteVisitor では、Visitor::Visitor で規定されたプロトコルに従って、各機能を実現します。

## --------------------             # Visitor::ConcreteVisitor
class ImageVisitor(XVisitor):
    def visit_EllipseShape(self, e):
        brush = ImageBrush(
            ImageSource=BitmapImage(
                Uri("sunflower.jpg", UriKind.Relative)))
        e.shape.Fill = brush
    def visit_PolygonShape(self, e):
        e.shape.Stroke = Brushes.Black

規定されたプロトコル visit_EllipseShape に従って、対象となる shape を表現するのに最適な方法を実現します。
visit_PolygonShape についても同様ですが、具体的な方法は読者への課題として、残してあります。これをどのように実現するかは、自由です。このとき、他の対象の存在を気にする必要はなく、その対象に関する知識を必要としないのが、このパターンの効能のひとつです。

## --------------------             # Visitor::ConcreteVisitor
class VisualVisitor(XVisitor):
    def __init__(self, visual):
        self.visual = visual
    def visit_EllipseShape(self, e):
        brush = VisualBrush()
        brush.Visual = self.visual
        e.shape.Fill = brush
    def visit_PolygonShape(self, e):
        e.shape.Stroke = Brushes.Black

ここでは、前述した ImageVisitor とは違って、他の対象の存在を気にする必要はありませんが、「必要なら」その対象 self.visual に関する知識を「利用できる」ことが、このパターンの効能のひとつです。
その他の機能については割愛しますので、付録を参照してください。


Previous|2/3|Next