2012-11-01 130 views
3

我遇到了一個應該使用領域模型中的戰略模式的例子。我有一個用戶類代表系統的用戶。每個用戶在使用系統時都可能會收到請求。一旦接收到請求時,一些處理邏輯是可能的:領域模型中的戰略模式

  • 自動刪除請求
  • 通知用戶有關接收到的請求
  • 等...

在這種情況下,似乎戰略模式是適應的。我有一個名爲RequestReceivedPolicy的接口,它有多個實現此接口的類(即每個處理邏輯有一個類)。類對應於所選策略的類的一個實例保存引用。

這似乎是正確的對象方。我的問題涉及持久性方面,在我的情況下,它是一個關係數據庫。用戶通過管理界面選擇策略。我想堅持這個選擇,以便下次用戶登錄時,保存此信息。我想過堅持堅持類的實例,但我不認爲這是正確的方式,因爲這個實例更關心邏輯而不是數據。

感謝


編輯:

public RequestReceivedPolicy { 
    public boolean processRequest(); 
} 

public IgnoreRequestPolicy implements RequestReceivedPolicy { 
    public boolean processRequest(){ 
     //ignore logic 
    } 
} 

public CustomRequestPolicy { 
    private int someData1; 
    private String someData2; 

    public boolean processRequest(){ 
     //custom logic that uses someData1 and someData2 
    } 
} 
+0

這取決於。您是否需要'RequestReceivedPolicy'實例的詳細信息,或僅需瞭解與​​用戶關聯的請求接收策略的類型? – neontapir

+0

@neontapir由於每種策略類型都具有處理所需的關聯信息,因此我認爲我需要這些信息和策略類型。 –

+0

使用數據建立表示邏輯模型的標準,就像規則引擎一樣。我認爲這個概念有一個術語,但我想不出一個名字。基本上,你希望你的控制器以數據的形式使用模型指令,然後你堅持下去取決於你。如果我正確理解你的問題。 – amphibient

回答

1

的政策選擇持久性的位置取決於在哪裏/怎麼說政策在被傳遞或設置成你的User類,並你並沒有真正精通這一點。

如果,例如,您User類有這樣的事情:

class User 
{ 
    // policy is passed in during ctor 
    public User(object otherArgs, RequestReceivedPolicy policy) 
    { 
    } 
} 

...那麼該類負責創建User將可能不得不維持偏好外部User

同樣,如果用戶對象簡單持有RequestReceivedPolicy參考這樣的:

class User 
{ 
    public User(object otherArgs) 
    { 
    } 

    public void setPolicy(RequestReceivedPolicy policy) 
    { 
     _currPolicy = policy;  
    } 

    public RequestReceivedPolicy getPolicy() 
    { 
     return _currPolicy;  
    } 

} 

...和User類有沒有辦法確定自己的策略對象,話又說回來,你必須依靠外部實體堅持政策選擇。

反之,如果政策選擇是 「拉」 到User類是這樣的:

class User 
{ 
    public User(object otherArgs, RequestReceivedPolicyProvider policyProvider) 
    { 
    } 

    public void someStimulii(object criteria, ...) 
    { 
     _currPolicy = _policyProvider.getPolicy(criteria); 
    } 

} 

...或...這

class User 
{ 
    public User(object otherArgs) 
    { 
    } 

    public void someStimulii(object criteria, ...) 
    { 
     _currPolicy = PolicyProvider.getInstance().getPolicy(criteria); 
    } 

} 

...那麼User對象應該保持它的選擇,以便它可以在稍後重新創建/構造時抽取該策略對象。在這種情況下,它是「標準」,將需要被保留,如果RequestReceivedPolicy有一個額外的方法返回的標準可能會有所幫助:

RequestReceivedPolicyConfig policyConfig = _currPolicy.getConfiguration(); 

RequestReceivedPolicyConfig對象應該是不透明的用戶對象,但內部可能是支持持久性的簡單字典。然後,用戶可以將其傳遞到持久層,而不必瞭解它。從持久層拉出時,它將用於使用提供程序重新安裝RequestReceivedPolicy。最少,每個RequestReceivedPolicyConfig對象將包含RequestReceivedPolicy的類標識。

有可能有一個混合,其中策略是通過設置/獲取,但用戶對象也可以通過類似上面的PolicyProvider.getInstance().getPolicy(criteria)拉入新策略,那麼你仍然允許用戶對象利用基於RequestReceivedPolicyConfig的方法或保持外部持久性。