我有两个课程:抽认卡和套装。抽认卡处于七个阶段之一 - 每个阶段都应该有一个 TimeSpan 属性。目标是在特定时间跨度后显示卡片,具体取决于卡片所在的阶段。
一套也处于这七个阶段之一 - 所有卡中最低的阶段。
这两个类目前都有一个“public int Stage”属性,但我觉得这并不理想。
就类/对象定义而言,对此进行建模的适当方法是什么?我正在使用 MVC4 EF CodeFirst,以防万一。
我有两个课程:抽认卡和套装。抽认卡处于七个阶段之一 - 每个阶段都应该有一个 TimeSpan 属性。目标是在特定时间跨度后显示卡片,具体取决于卡片所在的阶段。
一套也处于这七个阶段之一 - 所有卡中最低的阶段。
这两个类目前都有一个“public int Stage”属性,但我觉得这并不理想。
就类/对象定义而言,对此进行建模的适当方法是什么?我正在使用 MVC4 EF CodeFirst,以防万一。
状态机:http ://en.wikipedia.org/wiki/State_pattern 。
基本上,您有一个状态环(您的所有状态都实现一个接口)。然后你让你的状态转换器类实现一个“参与者”接口,如下所示:
// All stages should implement this
interface IStateRing
{
}
// Everything participating in the state ring should implement this
interface IStateRingParticipant
{
void SetStage(IStateRing stage);
}
您的参与者类的唯一工作是在状态告诉它时响应状态变化,如下所示:
class MyStageParticipant : IStateRingParticipant
{
// Keep track of the current state.
IStateRing currentStage;
// This is called by the state when it's time to change
public void SetStage(IStateRing stage)
{
throw new NotImplementedException();
}
}
请注意,它会跟踪它所处的状态,然后有一个由当前状态调用的函数 SetStage。接下来我们有我们的状态:
// The state handles the actual functionality, and when it's good and ready
// it commands the participant to change states.
class StateA : IStateRing
{
// Keep track of the participant.
IStateRingParticipant participant;
// The constructor should know what object belongs to this state.
// that is, which object is participating.
public StateA(IStateRingParticipant participant)
{
this.participant = participant;
}
// We do all of our processing in this state.
// Then when it's time we simply let go of the participant and
// instantiate a new state.
public void GoodAndReady()
{
new StateB(participant);
}
}
class StateB : IStateRing
{
IStateRingParticipant participant;
public StateB(IStateRingParticipant participant)
{
this.participant = participant;
}
}
请注意,构造函数的一部分是它接受参与者。状态管理所有实际处理,然后当它准备好并准备好时,它会实例化下一个状态(也保持当前状态),依此类推。
使用状态模式,您将所有功能路由到状态,然后让它们确定状态何时应该更改(通过实例化状态的新实例)。