首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >状态管理体系结构

状态管理体系结构
EN

Stack Overflow用户
提问于 2013-11-17 22:35:32
回答 3查看 97关注 0票数 2

我拥有的:

A和B实体之间的一对多关系。每一个实体都有地位。有一定数量的状态,每个大约7-12个.

我必须检查转换(从一种状态到另一种状态)是否可能是。并在转换过程中执行很少的额外任务,比如存储历史记录和日志记录。

不要误入歧途,地位不等于国家。这与State Pattern无关,因为我的实体没有任何基于状态的逻辑。

它是如何发生的:

实体作为更新请求的一部分到达,我比较实体的旧版本是否具有与新版本相同的状态。如果没有-状态已经改变了。状态只是一个字符串或枚举。

我想要的:

当然,也有一些规则对国家过渡施加了限制。我想要下一个:

  1. 过渡核查。意味着我要检查实体是否可以移动到所请求的状态。示例:只有在A-entityX-state中并且所有相关的B-entities都在Z-state中时,它才能被移动到Y-state
  2. 自动过渡(并非在所有情况下)。意味着A-entity的状态应该始终与所有链接的B-entities保持一致。示例:如果我将B-entity移动到X-state而不是相关的A-entity,那么A-entity应该移动到‘Y状态’。
  3. 商店历史。意味着哪个实体和何时被转移到国家。

什么问题:

简单的解决方案是编写一个转换矩阵,其中matrix[i][j] == 1 (如果转换是可能的话),而0 (如果可能的话)。但也有一些问题:

  1. 当转换不仅取决于更新实体的状态时,情况又如何呢?矩阵解决不了这个问题。
  2. 那历史和罗格呢?
  3. 如何避免大量的if-statements

问题

我正在寻找适合这种情况的模式/通用实践。什么是解决任务的模式/最佳实践?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-18 08:21:02

A和B项应该实现相同的接口,例如

代码语言:javascript
复制
boolean canMove(State newState); // A-items know which B-items to check
void performMove(State newState, HistoryAndLog historyAndLog); // A-items and B-items will record history and log as appropriate. A-item will change related B-items as appropriate

在这种情况下,我们使用复合(A项检查相关B项是否可以按需要更改状态)和委托(让A项和B项更新日志并根据需要存储历史记录)。这就消除了大量if语句的需要。

A-和B-项的基本设计可能应该是“状态模式”,可能与Fly权重相结合,这样您就可以使用底层的转换矩阵来实现部分逻辑。

编辑:扩展飞重..。对于一个no转换矩阵,只存储一个yes/no值需要一点。如果相反,您必须存储一个对象pr。单元格,这将花费更多(对象的内部代表)。相反,根据工厂类的请求创建一个临时对象比较便宜。通常是100或100以上的倍数。对象。

基本上,您需要在这种情况下进行计算(按需创建对象)以进行存储(避免存储N对象)。

你可以想象到这样的事情

代码语言:javascript
复制
class Factory {

  private boolean canTransitionItemA(final int n, final int m) {
    // Look up in matrix
  }

  public ItemType makeItemAFromCoordinates(final int n, final int m) {
    return new ItemA() {
      public boolean canTransition(<blabla>) {
        return canTransitionItemA(n, m) && canTransitionRelatedBItems(n, m);
      }
      <bla bla bla>
    }
  }
}
票数 1
EN

Stack Overflow用户

发布于 2013-11-18 05:50:36

您坚持认为这不是状态模式,但您的描述恰恰是有限状态机的描述。你有一套有限的状态。您有状态更改的转换事件。这些过渡事件需要有警卫,以确保过渡是有效的。您有退出和/或入口操作(日志)。这都是典型的状态机行为。

看看http://smc.sourceforge.net/。这个项目将使用您创建的.sm文件,并在您选择14种语言时为您生成一个状态机。

使用这样一个工具的原因之一是代码生成器产生已经工作的代码。您不必测试它生成的状态机的机制,您只需测试您的转换和验证。

票数 2
EN

Stack Overflow用户

发布于 2019-02-18 21:24:38

在这里,我基于Enum写了一些简单的东西:)它是作为这篇文章的艺术而写的。How to implement status transitions for an Entity in java?,它的目的是通过Hibernate来表达状态。

代码语言:javascript
复制
public enum State {
    STATE1,STATE2(STATE1),STATE3(STATE1,STATE2);

    private State[] previousStates;

    private State(){

    }
    private State(State ...state) {
        this.previousStates =state;
    }

    public State transition(State state) throws Exception {
        for(State tmp: state.previousStates) {
            if (this == tmp) {
                return state;
            }
        }
        throw new Exception("Illegal state");

    }

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20037112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档