API设计/命令模式与“正常实现”

时间:2012-04-30 12:01:53

标签: java api design-patterns

我正在开发树形结构存储,我们目前使用事务方法来修改树结构。我一直认为使用命令模式是合适的。但是我只是改变了一个小行为,我喜欢它(返回位于插入节点的事务实例(属性除外)):

wtx.insertText(EInsert.ASRIGHTSIBLING, "value").insertElement(EInsert.ASRIGHTSIBLING, new QName("bla").insertElement(EInsert.ASFIRSTCHILD, new QName("blubb")).insertAttribute(new QName("foo"), "bar").insertAttribute(new QName("bar"), "foo"));

我认为以这种方式链接操作非常好,但是我们的事务在树上提供了类似游标的方法(moveTo(long)moveToParent()moveToFirstChild() ...),它们返回布尔值而不是当前的事务实例,但我认为这是无法避免的。否则我们甚至可以在没有繁琐的

之间进行移动
wtx.method();wtx.method();wtx.method();

但是我想到了命令模式

new InsertText(EInsert.ASRIGHTSIBLING, "value").execute(wtx);
new InsertElement(EInsert.ASRIGHTSIBLING, new QName("bla")).execute(wtx);
...

这有点冗长但很好,它会“支持”非常好的开/闭原则。

那么,您怎么看?

1 个答案:

答案 0 :(得分:1)

我的树形结构听起来像是一个巨大的复合物体。由于您还在处理构建事务,我认为使用Command模式是合适的,但是如果可能的话,您应该考虑将execute()调用包装在某种类型的控制器中,以便在可能的情况下将命令和构建器模式混合在一起

public void directorMethod(Object wtx) {
  InsertText(EInsert.ASRIGHTSIBLING, "value").execute(wtx);
  InsertText(EInsert.ASRIGHTSIBLING, "blah").execute(wtx);
}

注意,void返回可能是你的树结构,而wtx参数可以是事务和/或树结构,我不一定确定你想要怎么做。使用Builder的想法是从底层实现中抽象出Composite事务的构建。这样,如果您需要更改基础命令,您应该能够这样做并原子测试。