这个java模式叫什么?

时间:2013-10-31 06:01:50

标签: java oop design-patterns

我想知道下面的模式是什么,如果它有名字的话。

目的

存储与对象(MyObject)关联的数据,但该数据对于处理该对象的接口的实现是私有的。对象的客户端没有业务查看此数据。

替代

一些替代方案

  1. 在接口的实现中维护WeakHashMap<MyObject, FooApiMyObjectAttachment>
  2. 使用子类化和工厂到处创建值,以便额外的数据可以存储在子类中或
  3. 使用子类化并接受API中的MyObject 子类。
  4. 代码示例

    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.指向父节点的指针,原始信息)

    问题

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

4 个答案:

答案 0 :(得分:1)

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

在线查找参考资料,概述整部:

有时称为复合

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

无法直接访问部件

将对象组合成树结构以表示部分整体层次结构。 整部分允许客户统一处理单个对象和对象的组合

Composite Pattern

你所做的和复合之间的区别在于你存储的是非复合材料,所以你没有得到复合材料允许的树形结构,但是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>