3

我遇到了一个应该使用域模型中的策略模式的例子。我有一个代表系统用户的用户类。每个用户在使用系统时可能会收到请求。在接收到请求后,一些处理逻辑是可能的:

  • 自动删除请求
  • 通知用户收到的请求
  • ETC...

在这种情况下,似乎调整了策略模式。我有一个名为RequestReceivedPolicy的接口,其中有多个实现该接口的类(即每个处理逻辑一个类)。User类持有与所选策略对应的类的一个实例的引用。

这在对象方面似乎是正确的。我的问题涉及持久性方面,在我的情况下,它是一个关系数据库。用户通过管理界面选择策略。我想保留此选择,以便下次用户登录时保存此信息。我考虑过持久化User类持有的实例,但我认为这不是正确的方法,因为这个实例更多的是关于逻辑而不是数据。

谢谢


编辑:

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
    } 
}
4

1 回答 1

1

策略选择持久性的位置取决于该策略在何处/如何传入或配置到您的User类中,而您并没有真正详细说明。

例如,如果您的User班级有这样的事情:

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

...那么负责创建的类User可能必须在User.

同样,如果 User 对象简单地持有 RequestReceivedPolicy 引用,如下所示:

class User
{
   public User(object otherArgs)
   {
   }

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

   public RequestReceivedPolicy getPolicy()
   {
      return _currPolicy;       
   }

}

...并且User该类无法设置自己的 Policy 对象,然后,您必须再次依赖外部实体来保持策略选择。

如果相反,策略选择被“拉”到 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);
   }

}

...然后用户对象应该保持其选择,以便它可以在稍后重新创建/构造时拉出该策略对象。在这种情况下,需要持久化的是“标准”,如果RequestReceivedPolicy有额外的方法来返回该标准可能会有所帮助:

RequestReceivedPolicyConfig policyConfig =  _currPolicy.getConfiguration();  

RequestReceivedPolicyConfig对象应该对 User 对象不透明,但在内部可能是支持持久性的简单字典。然后用户可以将其传递给持久层,而无需对其了解太多。从持久层拉出来时,它用于RequestReceivedPolicy使用提供程序重新安装。至少,每个RequestReceivedPolicyConfig对象都包含 RequestReceivedPolicy.

可以有一个混合,其中策略通过 set/get 推送,但用户对象也可以通过类似上述的方式拉入新策略,PolicyProvider.getInstance().getPolicy(criteria)然后您仍然允许用户对象利用RequestReceivedPolicyConfig基于方法或保持持久性外部的。

于 2012-11-02T12:47:31.647 回答