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)とは独立した記述が可能になります。
このように、さまざまな観点から役割分担を促進することで、複雑なアプリケーション開発の負荷を明確に分散できるようになります。さらに、機能を実現する方法に変更があっても、これに柔軟に対処できるようになります。