2012-12-27 42 views
2

我已经实现了一个应该在我的模型类上运行的简单状态模式。我的应用程序是用C#WPF编写的。状态模式 - 在每个转换之前执行操作

首先,我不太清楚在哪里需要放置状态模式逻辑。我应该把它放到我的控制器或服务类中吗?

假设您想在进行实际转换之前验证一些事情。 目前我已经创建了一个可以直接从状态模式类中调用的规范。

但这是正确的做法吗?

interface ISpecification<T> 
{ 
    bool IsSatisfiedBy(T sut); 
} 

class DetermineDockingSate:ISpecification<Vehicle> 
{ 
    public bool IsSatisfiedBy(Vehicle sut) 
    { 
     throw new NotImplementedException(); 
    } 
} 

这是用于状态模式内的验证/检查点。但是在转换之前应该在状态模式内执行的动作呢?

我会在一种服务类中实现这些动作,并直接从我的状态模式调用这些服务类。

public override void Dock() 
    { 
     Console.WriteLine("Dock Machine and going to the Vehicle status."); 

     DockingStateEngineService myService = new DockingStateEngineService(); 

     Func<string,bool> messageTarget; 

     messageTarget = myService.DetermineDockingSate; 

     bool ok = messageTarget("NOT"); 

     this.Engine.setCurrentState(Engine.Vehicle); 
    } 

这是否再次是正确的方法?

+0

这个问题太广泛了,无法提供明确的答案吗? – JVGAG

+0

看到这个MSDN文章的实际代码:http://msdn.microsoft.com/en-us/magazine/cc301852.aspx和国家的代码是在这里(图6-7)http://msdn.microsoft.com /en-us/magazine/bb985799.aspx – oligofren

回答

2

根据HeadFirst,具体状态是否应该决定下一个状态是一个没有绝对答案的问题。
如果状态转换是固定的,那么上下文决定下一个状态是合适的。
如果转换更具动态性,则通常将决策置于状态类中(例如,如果决策取决于上下文类中变量的运行时值)。

显然,这会在状态类之间创建依赖关系。这可以通过将状态作为上下文类中的成员来最小化。

相关问题