如何设计模型以允许应用或取消更新?

时间:2017-06-06 06:35:42

标签: java design-patterns

是否有设计或开发模式,我们处理更新实际数据的副本,并在需要时将差异应用于原始参考?

如果没有,设计此类模型的最佳方法是什么?

我认为我应该做的事情:

  1. 我应该使用枚举mode来指示模型是否在“更新直接参考模式”中使用或“仅更新复制模式”
  2. 更新数据的设置者和获取者,以根据所使用的模型的模式引用actualStatetemporaryState
  3. mode的setter方法创建实际数据的副本并将其存储在临时状态。如果mode更新为update direct reference,请清除temporaryState
  4. 创建一种方法,将temporaryState的更改应用于actualState。该方法还应从内存中清除临时状态。
  5. 在代码中:

    enum InsertionMode {
        UPDATE_DIRECT, UPDATE_COPY
    }
    
    class Store {
      private Data actualState;
      private Data temporaryState;
      private InsertionMode mode;
    
      private void resetTemporaryState() {
        ....
      }
    
      private void initTemporaryState() {
        this.temporaryState = copy(actualState);
      }
    
      private commitTemporaryState() {
        this.actualState = this.temporaryState;
        this.resetTemporaryState();
      }
    
      public Data setInsertionMode(InsertionMode mode) {
        if (this.mode != mode) {
            InsertionMode previousMode = this.mode;
            this.mode = mode;
    
            if (previousMode == InsertionMode.UPDATE_COPY) {
                this.resetTemporaryState();
            }
            if (this.mode == InsertionMode.UPDATE_COPY) {
                this.initTemporaryState();
            }
        }
      }
    
      public void commit() {
        if (this.mode == InsertionMode.UPDATE_COPY) {
            this.commitTemporaryState();
        }
      }
    
      public void abort() {
        if (this.mode == InsertionMode.UPDATE_COPY) {
            this.resetTemporaryState();
            this.setInsertionMode(InsertionMode.UPDATE_DIRECT);
        }
      }
      ...
    }
    

1 个答案:

答案 0 :(得分:2)

给定的代码是“好的”,因为它将支持您的要求。

但是:更新对象是一种简单的方法,并且易于实现。但根据您的具体情况,您在2017年的工作方式会有所不同。

而不是让一个可变对象改变状态,你可以改为使用不可变对象。状态变成了这类对象的序列。

到达新状态意味着在序列的末尾添加新创建的对象,取消意味着使用旧的未更改的序列。这种方法是blockchain应用程序的基础;但它也可以缩小到更小的上下文 - 只需查看其核心方面:您永远不会通过更改现有对象来更改状态,而是通过创建对象。当然,这需要很多思考;你不想盲目地复制一切;你可能会更多地看到“delta”对象(代表个别变化)和显示增量聚合的“视图”。

除此之外:您可能想要了解CQRS与CRUD(例如this)。