我拥有的:
A和B实体之间的一对多关系。每一个实体都有地位。有一定数量的状态,每个大约7-12个.
我必须检查转换(从一种状态到另一种状态)是否可能是。并在转换过程中执行很少的额外任务,比如存储历史记录和日志记录。
不要误入歧途,地位不等于国家。这与State Pattern无关,因为我的实体没有任何基于状态的逻辑。
它是如何发生的:
实体作为更新请求的一部分到达,我比较实体的旧版本是否具有与新版本相同的状态。如果没有-状态已经改变了。状态只是一个字符串或枚举。
我想要的:
当然,也有一些规则对国家过渡施加了限制。我想要下一个:
A-entity在X-state中并且所有相关的B-entities都在Z-state中时,它才能被移动到Y-state。A-entity的状态应该始终与所有链接的B-entities保持一致。示例:如果我将B-entity移动到X-state而不是相关的A-entity,那么A-entity应该移动到‘Y状态’。什么问题:
简单的解决方案是编写一个转换矩阵,其中matrix[i][j] == 1 (如果转换是可能的话),而0 (如果可能的话)。但也有一些问题:
if-statements?问题
我正在寻找适合这种情况的模式/通用实践。什么是解决任务的模式/最佳实践?
发布于 2013-11-18 08:21:02
A和B项应该实现相同的接口,例如
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对象)。
你可以想象到这样的事情
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>
}
}
}发布于 2013-11-18 05:50:36
您坚持认为这不是状态模式,但您的描述恰恰是有限状态机的描述。你有一套有限的状态。您有状态更改的转换事件。这些过渡事件需要有警卫,以确保过渡是有效的。您有退出和/或入口操作(日志)。这都是典型的状态机行为。
看看http://smc.sourceforge.net/。这个项目将使用您创建的.sm文件,并在您选择14种语言时为您生成一个状态机。
使用这样一个工具的原因之一是代码生成器产生已经工作的代码。您不必测试它生成的状态机的机制,您只需测试您的转换和验证。
发布于 2019-02-18 21:24:38
在这里,我基于Enum写了一些简单的东西:)它是作为这篇文章的艺术而写的。How to implement status transitions for an Entity in java?,它的目的是通过Hibernate来表达状态。
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");
}
}https://stackoverflow.com/questions/20037112
复制相似问题