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 に関する知識を「利用できる」ことが、このパターンの効能のひとつです。
その他の機能については割愛しますので、付録を参照してください。