2

たとえば、0個以上のブランチを「持っている」クラスTreeがあり、各ブランチが0個以上のFruitなどを「持っている」とします。

すべてのデータを単一のオブジェクトとして扱うことができる1つのオブジェクトを作成したいとします。そのため、私のインターフェースのユーザーは、「ツリー、すべてのブランチを反復処理します。ブランチごとに、フルーツの数を追加します。全部あります。」代わりに、「木、あなたはいくつの果物を持っていますか?」と言うでしょう。または「リンゴはいくつありますか?」

これはどんなオブジェクトですか?どのようなデザインパターンが適用できますか?

4

3 に答える 3

5

私にはビジターパターンのように聞こえます-http://en.wikipedia.org/wiki/Visitor_patternを参照してください。

ウィキペディアの記事では、車の要素で構成される車の例を示しています。基本クラスCarElementVisitorがあります。要素と基本ビジタークラスが連携して、ツリーを反復処理できるようにします。

あなたの場合、ツリーやフルーツなどをナビゲートする方法を知っている基本クラスTreeElementVisitorがあるかもしれません。

"Tree, how many fruit do you have?" 

この問題を解決するには、FruitCountingVisitorというTreeElementVisitorのサブクラスを作成します。このサブクラスは、実行中のカウントをメンバー変数として保持します。すべてのvisitFruitメソッドがカウンターをインクリメントします。visitTreeなどの他の方法visitBranchは何もしません。

Tree tree = // create a tree
FruitCountingVisitor visitor = // create the visitor
tree.accept(visitor);
System.out.println(visitor.getCount());

次に、AppleCountingVisitorを作成するか、FruitCountingVisitorを一般化して、コンストラクター引数に基づいて特定のフルーツをフィルター処理することができます。

于 2012-10-23T00:55:41.923 に答える
2

それはまさに複合パターンです:

オブジェクトをツリー構造に構成して、部分全体の階層を表します。Compositeを使用すると、クライアントは個々のオブジェクトとオブジェクトの構成を均一に扱うことができます。

余談ですが、Compositeパターンを使用すると、Visitorを使用してツリーのノードを簡単に操作できます。

于 2012-10-23T11:57:02.720 に答える
1

Java固有ではないソリューションについても興味があるかもしれません。その場合は、 foldを使用できると思います。ウィキペディアでは、ツリーのような構造を反復処理し、その反復からある種の結果を生成するための非常に一般化されたアプローチについて説明しています。

http://en.wikipedia.org/wiki/Catamorphism#Example

以下も参照してください。

http://en.wikipedia.org/wiki/Fold_(higher-order_function

于 2012-10-23T01:05:56.813 に答える