可以在这里实现状态模式吗?

时间:2010-07-22 06:55:31

标签: design-patterns pattern-matching anti-patterns

我有一个 Request 类,可以处于以下状态之一:

草案 提交后, 批准, 被拒绝, InMission, 完成

可以通过调用以下方法之一来更改 Request 对象的状态。每种方法都可能包含一些参数,以进一步将某些数据与特定状态相关联:

void Submit(string by) { }
void Approve(string by, string comment) { }
void Reject(string by, string comment) { } 
void AddToMission(Mission mission) { } 
void Complete() { }

我在考虑在这里实施模式。我的每个州级课程都会保存与他们相关的额外信息。我在这里实现 State 模式的主要想法是不在 Request 类本身中添加所有这些未发布的属性,例如:

public string ApprovedBy;
public string ApprovedComment;
public string RejectedBy;
public string RejectedComment;
public Mission Mission; 

您认为模式是否适合在此实施?

此致

MOSH

2 个答案:

答案 0 :(得分:0)

状态模式的优点是您无法在草稿上调用Complete(),因为它根本没有该方法。但是,您似乎想要一个更复杂的类结构。

  • 已提交草稿
  • 已批准已提交
  • 拒绝已提交
  • 已完成已获批准

所以你会比实现某些Document接口的所有这些更像一棵深树。

如果你想要这个,那就好好想想,因为超过3个级别的嵌套类是一件很麻烦的事情。解决方案可以是仅生成两个或三个实数类型,并将一些状态存储在属性字段中。例如,草案将具有属性Rejected或Status。

另一种方法是使用Decorator模式。也就是说,如果文档被批准,则构造一个新的Approved并将Draft传递给构造函数。这样,您就无法获得深度继承,仍然可以从草稿中获取信息。

答案 1 :(得分:0)

据我所知,您的问题是在课程之间传递不同的信息?

您可以将所有这些信息组合在一个结构或类中,并将其作为抽象Request方法的agrument转移。 因此,每个派生类(草稿,已提交,已批准)可以从此结构中获取所需信息或进行设置。 移动你可以像这样统一这个信息:

struct Info{
public string Status; // may be aproved  reqested or so.
public string Comment; // just a comment depending on state
//public string RejectedBy;
//public string RejectedComment; no need it
public Mission Mission; //extra info

}