違いは見られません。両方のパターンがオブジェクトを構成しようとしているようです。この 2 つのパターンの背後にある意図を説明できる人はいますか?
3 に答える
これらのパターンは完全に異なります!まず、コンポジットは構造パターンです。つまり、データ構造を構築するために使用されます。訪問者は行動パターンであり、関係と行動に責任があります。
もう少し詳しく説明すると、Compositeを使用して、すべての項目が のサブタイプであるオブジェクト ツリーを構築しますT
。T
ただし、 (一種のコンテナ)のサブクラスの 1 つは、子T
のコレクションを保持できます。とのItem
2 つのサブクラスがあるクラスを考えてみてください。さらに、製品またはボックスのコレクションを保持できます。これらのネストされたボックスはさらに多くのアイテムを保持できるため、効果的にツリーのような構造を構築しています。Product
Box
Box
Item
Visitorは、仮想呼び出しをエミュレートして のようinstanceof
な構造を回避するために使用されます。「instanceof」演算子のこの使用は悪い設計と見なされますか? を参照してください。完全な例については。VisitorはCompositeと一緒に使用できます。上記の例のように、メソッドItem
を定義するとツリーをトラバースできますaccept(ItemVisitor visitor)
。
この 2 つの類似点を見つけるのは非常に難しいと思います。
これらは異なるパターンですが、一緒に使用されることがよくあります。
複合のポイントは、インターフェイスを共有する一連の要素に同じ操作を適用することです。ビジターのポイントは、実装も呼び出し元の実装も変更せずに、一連の要素を新しい操作で拡張することです。したがって、次のことがよく見られます。
Composite c = new Composite();
Visitor v = new ConcreteVisitor();
c.visit(v);
このようにして、コンポジットとコンポジット内のクラスの実装を静的に保ち、それらに適用する Visitor の種類のみを変更できます。
Composite は、一連の操作とそれ自体のオブジェクトのコンテナーを持つオブジェクトです。コンテナには、オブジェクトが含まれている場合と含まれていない場合があります。Composite に対して実行される操作は、それ自体とそれに含まれるすべてのオブジェクトに対して実行されます。これを一種の木と呼ぶ人もいるかもしれません。
Visitor は、クラスの確立された階層で機能する一連のオブジェクト/操作です。ビジターを使用すると、階層を変更せずに階層上で操作を作成できます。例として、階層内の複数のオブジェクトを操作 (訪問) する操作を作成し、インターフェイスを変更せずに複数のオブジェクトの作業を組み合わせることができます。
2つのパターンは確かにかなり異なります。