名前がある場合、次のパターンは何と呼ばれているのだろうか。
目的
オブジェクト ( ) に関連付けられているがMyObject
、そのオブジェクトを処理するインターフェースの実装に対してプライベートなデータを格納します。オブジェクトのクライアントは、このデータを見る必要はありません。
代替案
いくつかの代替手段は
WeakHashMap<MyObject, FooApiMyObjectAttachment>
インターフェースの実装で維持される、- 値が作成されるすべての場所でサブクラス化とファクトリを使用して、余分なデータをサブクラスまたはサブクラスに格納できるようにします。
- サブクラス化を使用し、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
。これは、サブクラス化ではまったく実行できません。
ノードを処理するさまざまなモジュールによって使用されるさまざまなデータを使用して、ツリー書き換えシステムでツリー ノードに注釈を付けるために一般化された形式が正常に使用されるのを見てきました。(親ノードへのポインター、起点情報を参照)
質問
このパターンに名前はありますか?もしそうなら、それは何ですか?参照はありますか?