我想知道下面的模式是什么,如果它有名字的话。
目的
存储与对象(MyObject
)关联的数据,但该数据对于处理该对象的接口的实现是私有的。对象的客户端没有业务查看此数据。
替代
一些替代方案
WeakHashMap<MyObject, FooApiMyObjectAttachment>
,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
相比,缺点是MyObject
上对客户端无用的两种方法,但优点是简单。
这种模式的一个很好的属性是你可以将它概括为通过将字段更改为Map<Class<?>, Attachment> attachments
来为每个节点存储任意数量的不同类型的附件,这完全不能通过子类化完成。
我已经看到使用通用形式成功地在树重写系统中注释树节点,其中各种数据使用处理节点的各种数据。 (c.f.指向父节点的指针,原始信息)
问题
这种模式有名字吗?如果是这样,它是什么?有没有参考?
答案 0 :(得分:1)
它看起来像一个结构模式,非常接近于整体部分或复合材料。
在线查找参考资料,概述整部:
有时称为复合
帮助组合一起形成语义单元(整体)的组件(部件)的聚合。
无法直接访问部件
将对象组合成树结构以表示部分整体层次结构。 整部分允许客户统一处理单个对象和对象的组合
你所做的和复合之间的区别在于你存储的是非复合材料,所以你没有得到复合材料允许的树形结构,但是UML看起来就像没有猪耳朵一样。 / p>
答案 1 :(得分:1)
发现它!
可能有多个附件的表单(Map<Class<?>, Attachment> attachments
)由Erich Gamma描述为Extension Objects Pattern。
答案 2 :(得分:0)
The Gang of Four称之为 Memento 。
答案 3 :(得分:0)
Role Object Pattern真的非常相似,甚至可能达到我自己的问题的答案:它是角色对象模式。< / p>