2012-04-30 30 views
0

我正在研究一个树形结构的存储,我们目前使用事务方法来修改树形结构。我一直认为使用命令模式是合适的。不过,我只是改变了一个小问题,我喜欢它(返回位于插入节点事务实例(除了属性)):API设计/命令模式与“正常实现”对比

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

对我来说,树结构听起来像是可以像一个巨大的复合物体一样描述。既然你也在处理构建事务的问题,我认为使用Command模式是合适的,但是如果可能的话,你应该考虑将你的execute()调用包装在某种类型的director中,这样你可以将Command和Builder模式混合在一起。

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

注意,返回void可能是你的树结构和WTX参数可以是交易和/或树状结构,我不一定相信你会如何想这样做。使用Builder的想法是从底层实现中抽象组合事务的构建。这样,如果你需要改变一个基础命令,你应该能够做到这一点并自动测试。

+0

你是什么意思?“使用Builder的想法是从基础实现中抽象复合事务的构建。”?树结构本身是一个巨大的复合对象(带有“指针”)。我不确定是否值得努力。我们经常在内部使用这些方法,并且我将不得不重写一堆代码。但幸运的是,我们现在没有任何外部用户;-)所以我可以改变任何事情,我想提供一个干净漂亮的API。 – Johannes

+0

顺便说一句:通常你会使用某种导入(例如从XML文档),然后使用Java API或者某天使用XQuery Update或类似的东西做一些更改。 – Johannes

+0

@Johannes - 复合材料通常使用建筑师来建造。所以只要树结构被视为一个复合对象而不是一个文档或一个数据源,这是值得考虑的。这个想法是把建筑抽象成一个导演,这样你就可以保证正确的创作。 – Joe