2012-11-01 93 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的方法或保持外部持久性。