代码之家  ›  专栏  ›  技术社区  ›  Mosh

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

  •  0
  • Mosh  · 技术社区  · 15 年前

    我有一个 请求 可以处于以下状态之一的类:

    草稿, 提交, 经核准的, 拒绝, 完整的

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

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

    这里有图案。我的每个state类都将保存与它们相关联的额外信息。我要实现的主要想法 这里的模式是不在 请求

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

    你觉得呢

    当做,

    莫斯

    2 回复  |  直到 5 年前
        1
  •  0
  •   Sjoerd    15 年前

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

    • 已批准是已提交的
    • 已完成是已批准的

    如果您想这样做,请好好考虑,因为嵌套超过3个级别的类是一件很痛苦的事情。解决方案可以是只生成两个或三个实类型,并将一些状态存储在属性字段中。例如,草案将有一个被拒绝的属性或状态。

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

        2
  •  0
  •   Arseny    15 年前

    据我所知,你的问题是在不同的班级之间传递不同的信息?

    因此,每个派生类(Draft、Submitted、Approved)都可以从这个结构中获取或设置所需的信息。 移动你可以像这样统一这些信息:

    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