【问题标题】:Is it ok to implement State pattern here?可以在这里实现状态模式吗?
【发布时间】:2010-07-22 06:55:30
【问题描述】:

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

草稿, 提交, 得到正式认可的, 被拒绝, 在使命中, 已完成

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

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

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

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

您认为 State 模式适合在这里实施吗?

问候,

莫什

【问题讨论】:

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


    【解决方案1】:

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

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

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

    如果需要,请考虑清楚,因为嵌套超过 3 层的类很难处理。一个解决方案可能是只制作两个或三个真实类型,并将一些状态存储在一个属性字段中。然后,草案将具有例如属性 Rejected 或 Status。

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

    【讨论】:

      【解决方案2】:

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

      您可以将所有这些信息分组到一个结构或类中,并将其作为抽象请求方法的一个集合传输。 因此每个派生类(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
      

      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-07
        • 1970-01-01
        • 2015-05-23
        • 2020-03-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多