5

名前がある場合、次のパターンは何と呼ばれているのだろうか。

目的

オブジェクト ( ) に関連付けられているがMyObject、そのオブジェクトを処理するインターフェースの実装に対してプライベートなデータを格納します。オブジェクトのクライアントは、このデータを見る必要はありません。

代替案

いくつかの代替手段は

  1. WeakHashMap<MyObject, FooApiMyObjectAttachment>インターフェースの実装で維持される、
  2. 値が作成されるすべての場所でサブクラス化とファクトリを使用して、余分なデータをサブクラスまたはサブクラスに格納できるようにします。
  3. サブクラス化を使用し、API でMyObject サブクラスの両方を受け入れます。

コード例

public interface MyApi {
  void doSomething(MyObject x);
}

public class MyObject {
  public interface Attachment {} // empty interface, type bound only
  private Attachment attachment;
  public void setAttachment(Attachment attachment) {
    this.attachment = attachment;
  }
  public <T extends Attachment> T getAttachment(Class<T> type) {
    return type.cast(attachment);
  }
}

class FooApiMyObjectAttachment implements MyObject.Attachment {
  Foo foo; // some data that one MyApi implementer `foo' wants to persist between calls, but that is neither needed nor desired on MyObject 
}

class BarApiMyObjectAttachment implements MyObject.Attachment {
  Bar bar; // some data that another MyApi implementer `bar' wants to persist between calls, but that is neither needed nor desired on MyObject
}

class FooApi implements MyApi {
  // associates FooApiMyObjectAttachment with any MyObjects passed to it or created by it
}

class BarApi implements MyApi {
  // associates BarApiMyObjectAttachment with any MyObjects passed to it or created by it
}

サブクラス化と比較した場合の利点は、 の実装者が余分なデータをオブジェクトに関連付けることができるMyObjectように、 にファクトリが必要ないことです。MyApi

WeakHashMap実装者のa と比較すると、欠点はMyObjectクライアントにとって役に立たない 2 つの方法ですが、利点は単純さです。

このパターンの優れた特性は、フィールドを に変更することで、各ノードにさまざまなタイプの任意の数の添付ファイルを格納するように一般化できることですMap<Class<?>, Attachment> attachments。これは、サブクラス化ではまったく実行できません。

ノードを処理するさまざまなモジュールによって使用されるさまざまなデータを使用して、ツリー書き換えシステムでツリー ノードに注釈を付けるために一般化された形式が正常に使用されるのを見てきました。(親ノードへのポインター、起点情報を参照)

質問

このパターンに名前はありますか?もしそうなら、それは何ですか?参照はありますか?

4

4 に答える 4

1

それを見つけた!

複数のアタッチメントが可能な形式 ( Map<Class<?>, Attachment> attachments) は、Erich Gamma によってExtension Objects Patternとして説明されています。

于 2013-10-31T23:39:34.883 に答える
0

Role Object Patternは非常によく似ており、おそらく、私自身の質問に対する答えがRole Object Patternであると結論付けるところまでです。

于 2013-10-31T23:26:22.050 に答える
0

ギャング・オブ・フォーはこれをメメントと呼んでいます。

于 2013-10-31T23:24:31.380 に答える