Visitor パターンに加えて
古典的な Visitor パターンに捕われることなく、動的な問題解決を導入したのが、サンプルファイル VisitorBrush.py です。
具体的な WPF コントロール(TabControl/TabItem/WrapPanel)に関する情報は、マークアップを使って VisitorBrush.xaml ファイルの中に封じ込めてあるので、分離コードでは、それに依存しない部分だけを記述するように努めます。
## -------------------- # Visitor::ObjectStructure class ExWindow(Window): def _Controls(self, target): controls = xaml_controls(self) for e in target: setattr(self, e, controls[e]) visitors = ( SolidColorVisitor(), LinearGradientVisitor(), RadialGradientVisitor(), ImageVisitor(), DrawingVisitor(), VisualVisitor(self.imageBrush), ) for e, v in zip(target, visitors): items = getattr(self, e) for s in EllipseShape(), PolygonShape(): s.accept(v) items.Children.Add(s.shape)
すべての問題解決を静的(コンパイル時)に図るのではなく、それを動的(実行時)に委ねられるので、些末な状況に煩わされることなく、本質的な問題解決に専念できます。対象となる要素(EllipseShape/PolygonShape)と、それを表現する手段(SolidColorVisitor/LinearGradientVisitor/RadialGradientVisitor/ImageVisitor/DrawingVisitor/VisualVisitor)に関する問題提起を、事前に用意するだけで、事後の問題解決は、当事者に委ねるのを基調とします。
必要なときに Iterator を生成して、その機能を要求する立場(what)では組み込みの制御構造(for 文)を利用するだけです。すると、その要求を実現する立場(how)とは独立した記述が可能になります。
このように、さまざまな観点から役割分担を促進することで、複雑なアプリケーション開発の負荷を明確に分散できるようになります。さらに、機能を実現する方法に変更があっても、これに柔軟に対処できるようになります。