0

我有一个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() { }

我正在考虑在这里实现状态模式。我的每个状态类都将保存与它们相关的那些额外信息。我在这里实现状态模式的主要想法是不要在Request类本身中添加所有这些不相关的属性,例如:

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

你认为状态模式是一个很好的选择吗?

问候,

莫什

4

2 回答 2

0

据我了解,您的问题是在类之间传输不同的信息?

您可以将所有这些信息分组到一个结构或类中,并将其作为抽象请求方法的一个集合进行传输。因此每个派生类(Draft、Submitted、Approved)都可以从此结构中获取所需的信息或对其进行设置。Moveover 你可以像这样统一这些信息:

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

}

于 2010-07-22T09:11:43.867 回答
0

状态模式的优点是您不能调用Complete()Draft,因为它根本没有那个方法。但是,您似乎想要一个更复杂的类结构。

  • 提交的是草稿
  • 已批准是已提交
  • 拒绝是提交
  • 完成是一个批准

所以你会得到比所有这些实现一些 Document 接口的更深的树。

如果你想要这个,好好想想,因为嵌套超过 3 层的类是一件很痛苦的事情。一个解决方案可能是只制作两个或三个真实类型,并将一些状态存储在一个属性字段中。例如,草稿将具有属性 Rejected 或 Status。

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

于 2010-07-22T07:03:59.463 回答