2011-04-18 95 views
0

例子:處理子對象狀態當它影響雙親狀態

class Person 
{   
    @OneToMany 
    List<Action> actionHistory; 

    @ManyToOne 
    Employer employer; 

    private StateEnum myCurrentState = StateEnum.INITIAL_STATE; 
} 

想象一下這樣的情況,其中兩件事情是真的:

  1. Person.myCurrentState需要對變化的反應的變化行動歷史,僱主等。有一套業務規則,如「如果X行爲顯示在行動流中,且當前狀態爲Y,則將新狀態設爲Z」

  2. Pe rson需要能夠根據當前狀態阻止並允許對孩子進行一些操作。例如,在特定條件下可能無法更新僱主的職位,或者可能無法添加符合特定條件的操作。

最初我以爲我只是試圖通過Person中包含驗證/反應邏輯的例程來通過所有的訪問渠道。結果是Person對象變得太大而且到處都是,因爲需要監視的孩子有多少次操作。 (即,而不是隻是getAEmployer(),setNewEmployer()等類似的東西,它也是像updateJobTitleAtEmployer()等)

雖然邏輯分散給孩子似乎同樣凌亂。在這種情況下,僱主(例如)必須包含大量的參考資料給其父母。此外,與這些東西有關的業務規則分散在各地。

這個問題有沒有乾淨的通用解決方案?我想要一些通用的方法,我可以有一個Parent類的獸醫,並且在某些情況下可以對其中許多孩子的某些狀態變化做出反應。

更新: 我想我在這個問題中使用了術語「父母」和「孩子」。我使用它們是這樣的:父母「有一個」由孩子組成的「孩子/父母」。在這個例子中,Person是父類,屬性類是子類。

更好的例子:

class Employee 
{ 
    private Contract contract; 
    private List<Action> actions; 

    private EmployeeState currentState = EmployeeState.INITIAL; 
} 

試想在這種情況下currentState可能會改變某些東西在合同的變更(例如,如果利率上升)。如果員工處於某些州,那麼也可能不能在合同上設置某些事項。在當前狀態改變的情況下,合約屬性只是一個更大計算的一個因素(即,狀態可能由諸如「如果Contract.hourlyRate> 30並且動作包含具有這些屬性的動作而不是狀態爲......」的規則來確定)。

此外,在這種情況下,添加操作可能會更改Employee的狀態,或者根據當前狀態被阻止。

如果我遇到這些問題,我的模型可能有問題嗎?

+0

我只想確保術語清晰 - 當您在此處說「父母」和「孩子」時,您使用它來表示數據成員(「孩子」,(僱主))是「父母」('人'))? 我問,因爲我習慣聽繼承層次意義上使用的「父」和「孩」 - 「Person」的孩子將是一個延伸Person的類。但這似乎並不是你在這裏的意義。 – QuantumMechanic 2011-04-18 17:08:52

+0

是的,我認爲我誤用這些條款。在這種情況下,我使用「孩子」來表示父代中的一個類。 (所以父母與孩子有「有」或「有組合」的關係)。 – user426724 2011-04-18 17:55:01

+0

我仍然對你的例子感到困惑。我認爲職位是一名僱員/一個人而不是僱主/公司的財產。如果職稱取決於人的狀態,那麼setJobTitle函數應該檢查該狀態。 – Pace 2011-04-18 18:35:25

回答

1

從我的理解,你可以使用Observer pattern這種情況。在這種情況下,合同將訂閱僱主,以便當僱主的狀態發生變化時,合同將得到通知,並且可以根據當前狀態自行決定。