我想知道下面的模式叫什么,如果它有名字的话。
目的
存储与对象 ( 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
客户端没有用,但优点是简单。
这种模式的一个很好的特性是,您可以通过将字段更改为 来概括它以存储任意数量的不同类型的附件到每个节点Map<Class<?>, Attachment> attachments
,而子类化根本无法做到这一点。
我已经看到在树重写系统中成功使用通用形式注释树节点,其中处理节点的各种模块使用的各种数据。(cf 指向父节点的指针,来源信息)
问题
这种模式有名字吗?如果是这样,它是什么?有参考吗?