我希望状态图状态为给定枚举类型的值。在第二步中,我想使用状态图作为前面提到的枚举类型的属性的约束,例如,作为参数检查属性的setter。
答案 0 :(得分:0)
枚举属性以UML表示,如下所示:
_______________________
| <<enumeration>> |
| DaysOfTheWeek |
|_____________________|
| Sunday |
| Monday |
| Tuesday |
| ... |
|_____________________|
然后你可以在枚举和状态图之间绘制一个关联。
希望这有帮助
答案 1 :(得分:0)
我不了解您的详细实现,但我会将您重定向到状态机模式,这是一种实现状态机的非常优雅的方式。维基百科页面: http://en.wikipedia.org/wiki/State_pattern
答案 2 :(得分:0)
在某些工具中,您可以点击枚举&gt;创建状态图。这意味着状态图将在UML模型树中的枚举的根处创建。因此状态图将具有枚举属性。
答案 3 :(得分:0)
仍然不确定我完全明白你想要实现的目标。然而,这里有一些想法,希望它们有用。抱歉,如果我错过了这一点。
第一个问题是:为什么你想要枚举值和状态是同构的?在最普遍的意义上,它是复制信息。复制的信息有一种不同步的习惯。因此理解动机会很有用。
尽管如此,这里有几种可能性。
<强> 1。 UML /建模视角
在UML世界中,没有必要同时拥有状态模型和与之关联的枚举。 UML一般不定义如何读取对象当前状态的值;但是某些配置文件(例如Executable UML)可以。在Executable UML中,任何具有状态机的类都会自动获取名为current_state
的只读属性。 current_state
的可能值是状态模型中状态的名称。因此,您可以将其视为定义隐式枚举的状态机。
请注意,该属性是只读的。这是因为改变它的唯一方法是通过状态机,即通过向对象发送事件。所以它也满足了你的第二个要求:不可能以违反状态机协议的方式更改current_state
变量的值。
即使您没有使用可执行UML配置文件(或类似),将上述规则/约定说明也是完全有效的。如果有必要,你可以定义自己的个人资料,虽然这可能是过度的 - 取决于你的情况。
关键是建模领域不需要枚举。
<强> 2。代码视角
将模型转换为代码时,枚举是定义当前状态变量类型的明智且常用的方法。根据建模方案,您需要将current_state
属性仅读取到外部世界。然后你需要另外三件事:
current_state
变量的私有成员函数。因此,在代码世界中,您可以通过将current_state
变量仅读取到外部世界来阻止它的无效序列。也就是说,您只有一个公共读访问器:没有公共写访问器。
在类中,您将写访问器设置为私有,并确保它被调用的唯一位置是在状态机实现中。
您可以提供与驱动状态机的事件相对应的公共方法,而不是公共写入访问器。关于在下面实现状态机的更多细节,但现在这是一个简单的例子:
class Phone {
enum PhoneState {disconnected, connecting, connected, disconnecting};
public PhoneState current_state {get}; //no write accessor
//functions for generating state machine events
public void digit(int number) {..} //press digit key, e.g. while dialing
public void connect() {..} //make connection
public void disconnect() {..} //disconnect
}
实施状态机
实现状态机有3种常见模式: 1.状态矩阵或查找表 2.嵌套交换机 3.状态模式
对(1)here有一个很好的概述; (2)&amp; (3)涵盖here。
基本上就是这样。我不完全确定你回答了你的问题。如果不是道歉,也许你可以更具体地了解你想要实现的目标。
第h