Eclipse中的IProject.setDescription使用了什么设计模式

Rhu*_*arb 5 api design-patterns

我正在设计一个具有特定模式的API,但不知道这个模式是否有名称.它与GoF(Gang of Four)中的Command模式类似,但并不完全相同.

我可以找到的一个简单示例是在Eclipse中操作项目(IProject),而不是通过调用项目上的方法来改变其状态,但是通过这个3步过程:

  1. 使用.将其状态提取到描述符对象(IProjectDescription)中getDescription
  2. 设置描述符的属性.例如setName
  3. 使用描述符描述符应用回原始项目setDescription

一般原则似乎是你有一个复杂的对象作为一个框架的一部分,具有许多可能相互依赖的属性,而不是直接在该对象上工作,一次一个属性,你将属性提取到一个简单的数据对象,操纵,并将其应用回来.

它具有Command模式的一些属性,因为数据对象封装了所有的更改,就像Command一样 - 但它实际上不是一个Command,因为你不在对象上执行它,它只是一个表示对象的状态.

它还具有Transactional API的一些属性,其中,通过使用set...调用一次性更改所有内容,如果任何一个属性更改失败,则允许整个修改有效地"回滚".虽然这是该方法的一个优点,但它并不是它的主要目的.而且,只需在API中添加事务方法(如commitrollback),就可以在没有这种方法的情况下实现事务性质.

我希望利用这种模式有两个优点 - 尽管我没有看到它们被上面的eclipse示例利用:

  1. 您可以在其实现更改时表示基础对象的有意义状态.这对于从不同类型的表示升级或复制状态非常有用.假设我发布了我的API的新版本,我在其中创建了一个对象Foo2,这是我旧的Foo1的一种全新形式,但它们都具有相同的基本属性.要将Foo1升级为Foo2,我可以将这些属性提取为FooState.foo2.setFooState(foo1.getFooState)就像那样.解释和表示属性的方式封装在Foos中,可以完全不同.

  2. 我可以使用我的简单数据对象持久化并传输底层对象的状态,其中持久化对象本身会复杂得多.因此,我可以将Foo的状态提取为FooState,并将其保存为简单的XML文档,然后通过"加载"并应用它将其应用于某个新对象.或者我可以将FooState简单地作为JSON对象传输到web服务,而Foo本身太大而且传输复杂.(或者服务调用每一端的对象完全不同,如Foo1和Foo2)

无论如何,我无法在任何地方找到这种模式的名称或例子,无论是在Gang of Four设计模式中,甚至在Martin Fowler的全面"bliki"中也是如此.

Sud*_*kar 3

Martin Fowler 在他的《企业应用程序架构原理》一书中描述的数据传输对象(DTO)似乎是为了您在第 2 点中描述的目的。

DTO 是对其所代表的更复杂的域模型的相当简单的提取。

Fowler 描述了将 DTO 与汇编器结合使用可以使 DTO 独立于它应该表示的实际域对象(或多个对象)。汇编程序知道如何从域对象创建 DTO,反之亦然。他还提到 DTO 需要可序列化才能持久/传输其状态。您在第 2 点中描述的内容似乎与此描述相符。

您在第 1 点中描述的内容虽然似乎不是预期目的,但使用此模式似乎绝对可以实现。

我不确定您是否浏览过他的书的模式目录或书本身。这本书本身对此进行了更详细的描述。

您可能还想查看Oracle 的传输对象定义,Fowler在这里将其描述为 DTO。