gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 19:11:43 26 4
gpt4 key购买 nike

我正在设计一个具有特定模式的 API,但不知道该模式是否有名称。它类似于 GoF(四人组)中的命令模式,但不完全相同。

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

  • 使用 IProjectDescription 将其状态提取到描述符对象( getDescription )中
  • 在描述符上设置属性。例如。 setName
  • 将描述符应用回原始项目 setDescription

  • 一般原则似乎是,您将一个复杂的对象作为框架的一部分,该框架具有许多潜在的相互依赖的属性,而不是直接处理该对象,一次一个属性,而是将这些属性提取到一个简单的数据对象中,对其进行操作,并将其应用回来。

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

    它还具有事务 API 的一些属性,即通过使用 set... 一次性完成所有更改。调用,如果任何一个属性更改失败,您允许整个修改有效地“回滚”。但是,虽然这是该方法的一个优势,但这并不是它的主要目的。更重要的是,您可以在没有这种方法的情况下实现事务性质,只需向 API 添加事务方法(如 commitrollback )

    我确实想利用这种模式中的两个优点——尽管我没有看到上面的 eclipse 示例利用了它们:
  • 您可以在底层对象的实现发生变化时表示其有意义的状态。这对于从不同类型的表示升级或复制状态很有用。假设我发布了一个新版本的 API,我在其中创建了一个对象 Foo2,它是我的旧 Foo1 的全新形式,但两者都具有相同的基本属性。要将 Foo1 升级到 Foo2,我可以将这些属性提取为 FooState。 foo2.setFooState(foo1.getFooState) 就这么简单。解释和表示属性的方式封装在 Foos 中,并且可以完全不同。
  • 我可以用我的简单数据对象持久化和传输底层对象的状态,而持久化对象本身会复杂得多。因此,我可以将 Foo 的状态提取为 FooState,并将其保存为一个简单的 XML 文档,然后通过“加载”并应用它来将其应用于某个新对象。或者我可以将 FooState 作为 JSON 对象简单地传输到网络服务,而 Foo 本身太大且太复杂而无法传输。 (或者服务调用两端的对象完全不同,比如Foo1和Foo2)

  • 无论如何,我在任何地方都找不到此模式的名称或示例,无论是在 the Gang of Four design patterns 中,甚至在 Martin Fowler 的 comprehensive "bliki" 中也没有

    最佳答案

    Data Transfer Object (DTO) Martin Fowler 在他的书中描述的 Principles of Enterprise Application Architecture似乎是为了您在第 2 点中描述的目的。

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

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

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

    我不确定你是浏览了他的书的模式目录还是书本身。这本书本身更详细地描述了这一点。

    您可能还想看看 Transfer Object Fowler 所说的 Oracle 定义 here就是他所描述的 DTO。

    关于api - Eclipse 中的 IProject.setDescription 使用什么设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14338286/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com