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客户端没有用,但优点是简单。

这种模式的一个很好的特性是,您可以通过将字段更改为 来概括它以存储任意数量的不同类型的附件到每个节点Map<Class<?>, Attachment> attachments,而子类化根本无法做到这一点。

我已经看到在树重写系统中成功使用通用形式注释树节点,其中处理节点的各种模块使用的各种数据。(cf 指向父节点的指针,来源信息)

问题

这种模式有名字吗?如果是这样,它是什么?有参考吗?

4

4 回答 4

1

它看起来像一个结构模式,非常接近于整体部分或组合。

在线寻找参考,Whole-Part的概述:

有时称为复合

帮助聚合组成一个语义单元(整体)的组件(部分)。

无法直接访问零件

将对象组合成树结构以表示部分整体的层次结构。Whole-Part 让客户统一对待单个对象和对象的组合

复合图案

实际上,您所做的事情与复合材料之间的区别在于您存储的是非复合材料,因此您不会获得复合材料所允许的树结构,但是如果没有猪耳朵,UML 看起来会很相似。

于 2013-10-31T13:27:17.933 回答
1

找到了!

Erich Gamma 将多个附件可能的形式 ( Map<Class<?>, Attachment> attachments) 描述为扩展对象模式

于 2013-10-31T23:39:34.883 回答
0

四人组称这为纪念品

于 2013-10-31T23:24:31.380 回答
0

Role Object Pattern非常相似,甚至可能直到我得出结论,我自己的问题的答案是:它是 Role Object Pattern

于 2013-10-31T23:26:22.050 回答