我正在设计一个具有特定模式的 API,但不知道该模式是否有名称。它类似于 GoF(四人组)中的命令模式,但不完全一样。
我可以找到的一个简单示例是在 Eclipse 中,您可以在其中操作项目 ( IProject
),而不是通过调用项目上更改其状态的方法,而是通过以下 3 步过程:
- 将其状态提取到描述符对象 (
IProjectDescription
) 中getDescription
- 在描述符上设置属性。例如
setName
- 将描述符应用回原始项目
setDescription
一般原则似乎是你有一个复杂的对象作为具有许多潜在相互依赖的属性的框架的一部分,而不是直接处理该对象,一次一个属性,你将属性提取到一个简单的数据对象中,操纵它, 并将其应用回来。
它具有命令模式的一些属性,因为数据对象像命令一样封装了所有更改 - 但它不是真正的命令,因为您不会在对象上执行它,它只是表示对象的状态。
它还具有事务 API 的一些属性,通过set...
调用一次完成所有更改,如果任何一个属性更改失败,您允许整个修改有效地“回滚”。但是,虽然这是该方法的一个优势,但这并不是它的真正主要目的。更重要的是,您可以在没有这种方法的情况下实现事务性质,只需将事务方法添加到 API(如commit
和rollback
)
我确实想利用这种模式有两个优点 - 尽管我没有看到它们被上面的 eclipse 示例利用:
您可以在底层对象的实现发生变化时表示其有意义的状态。这对于升级或从不同类型的表示复制状态很有用。假设我发布了一个新版本的 API,我在其中创建了一个对象 Foo2,它是我的旧 Foo1 的全新形式,但两者具有相同的基本属性。要将 Foo1 升级为 Foo2,我可以将这些属性提取为 FooState。foo2.setFooState(foo1.getFooState) 就这么简单。解释和表示属性的方式封装在 Foos 中,并且可以完全不同。
我可以使用我的简单数据对象来持久化和传输底层对象的状态,而持久化对象本身会复杂得多。因此,我可以将 Foo 的状态提取为 FooState,并将其作为简单的 XML 文档保存,然后通过“加载”并应用它来将其应用到某个新对象。或者我可以将 FooState 作为 JSON 对象简单地传输到 Web 服务,而 Foo 本身太大且太复杂而无法传输。(或者服务调用两端的对象完全不同,比如Foo1和Foo2)
无论如何,我在任何地方都找不到这种模式的名称或示例,无论是在四人组设计模式中,还是在 Martin Fowler 的综合“bliki”中