2010-07-22 36 views
0

我有一個請求類,它可以是以下狀態之一:在這裏實現狀態模式可以嗎?

草案, 提交, 批准, 拒絕, InMission, 完成

的狀態請求可以通過調用以下方法之一來更改對象。每種方法可能包括一些參數進一步一些數據與特定狀態相關聯:

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

我想在這裏實現國家格局。我的每個州的班級都會保存與他們相關的額外信息。在這裏實現國家模式我的主要想法是不是在請求類本身添加所有這些unreleated屬性,如:

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

你覺得國家模式是在這裏實現一個很好的候選人?

問候,

MOSH

回答

0

狀態模式有,你不能叫Complete()一個草案,因爲它根本不具有法的優勢。但是,似乎你想要一個更復雜的類結構。

  • 提交一個草案
  • 批准被提交的
  • 拒絕被提交的
  • 完成是批准

所以,你會得到更多的像一個深樹比這些實施一些文檔界面。

想想你是否想要這樣做,因爲嵌套類超過3級是一個痛苦的工作。一種解決方案可能只是製造兩種或三種真實類型,並將某些狀態存儲在屬性字段中。然後,草案將有一個屬性被拒絕或狀態。

另一種方法是使用裝飾模式。也就是說,如果文檔被批准,您將構建一個新的批准並將草稿傳遞給構造函數。這樣,您不會得到深層繼承,您仍然可以從草稿中獲得信息。

0

據我瞭解,您的問題是在類之間傳輸不同的信息?

您可以將所有這些信息分組在一個結構或類中,並將其作爲抽象請求方法的一個擴展來轉換。 ,所以每個派生類(草稿,提交,批准)可以從這個結構中選取需要的信息或設置它。 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 

}