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

Api Eclipse中的IProject.setDescription使用什么设计模式,api,design-patterns,Api,Design Patterns,我在设计一个API时考虑了一个特定的模式,但不知道这个模式是否有名称。它类似于GoF(四人帮)中的命令模式,但并不完全相同 我可以在Eclipse中找到一个简单的例子,在Eclipse中,您操作一个项目(IProject),不是通过调用项目上更改其状态的方法,而是通过以下三步过程: 使用getDescription将其状态提取到描述符对象(IProjectDescription)中 在描述符上设置属性。例如,setName 使用setDescription 一般原则似乎是,您将一个复杂对象作为具

我在设计一个API时考虑了一个特定的模式,但不知道这个模式是否有名称。它类似于GoF(四人帮)中的命令模式,但并不完全相同

我可以在Eclipse中找到一个简单的例子,在Eclipse中,您操作一个项目(
IProject
),不是通过调用项目上更改其状态的方法,而是通过以下三步过程:

  • 使用
    getDescription
    将其状态提取到描述符对象(
    IProjectDescription
    )中
  • 在描述符上设置属性。例如,
    setName
  • 使用
    setDescription
  • 一般原则似乎是,您将一个复杂对象作为具有许多潜在相互依赖属性的框架的一部分,而不是直接处理该对象,一次处理一个属性,而是将属性提取到一个简单的数据对象中,对其进行操作,然后再应用它

    它具有命令模式的一些属性,因为数据对象像命令一样封装了所有更改-但它不是真正的命令,因为您不在对象上执行它,它只是对象状态的表示

    它还具有事务性API的一些属性,通过使用
    set…
    调用一次性完成所有更改,您可以在任何一个属性更改失败时有效地“回滚”整个修改。虽然这是这种方法的一个优点,但它并不是它的主要目的。更重要的是,不使用这种方法,只需向API添加事务方法(如
    commit
    rollback
    ),就可以实现事务性

    我确实想利用这个模式中的两个优点——尽管我不认为上面的eclipse示例会利用它们:

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

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


  • 无论如何,我在任何地方都找不到该模式的名称或示例,无论是在Martin Fowler中,还是在Martin Fowler的

    中都找不到。并非每个设计都记录为单个设计模式,事实上大多数系统设计都是多个模式的组合

    然而,在IProjectDescription中,您所做的一部分是使用,然而您的似乎是一个多态变体。考虑模式,因为它们出现在模式目录中,是削减到必要的起点,而不是最终结果。模式本质上是应该扩展和组合的

    可以为您提供提交和回滚(Do/Undo)功能,并以这种方式将其与Memento相结合是一种非常常见的方法。在JavaServletAPI中可以看到与HttpRequest和HttpResponse相同的东西。

    (DTO),Martin Fowler在他的书中描述的似乎就是为了实现第2点中描述的目的

    DTO是对它所表示的更复杂的域模型的相当简单的提取

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

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

    我不确定你是看了他的书的模式目录还是书本身。这本书本身对此进行了更详细的描述


    你可能还想看看甲骨文的定义,福勒说这就是他所说的DTO。

    Hmm,我知道你从哪里来,但这不是那种模式。调用方从API(“发起者”)获取一个对象并稍后将其发送回,这与此相似,但仅此而已。交易破坏者是“memento对象本身是一个不透明的对象(管理员不能或不应该改变)”,而在我的模式中,获取对象的全部目的是修改它,然后使用它来更新“发起者”,就像你所说的,它不完全适合#1,但会对它起作用。基本上,DTOs特性适合我的用例,但其目的是通过一根线传输状态,而不是封装更改的用例。但这仍然是9个月后最合适的答案,因此获得了奖项。