领域模型中的战略模式

时间:2012-11-01 19:13:20

标签: design-patterns strategy-pattern

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

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

在这种情况下,似乎采用了策略模式。我有一个名为 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
    } 
}

1 个答案:

答案 0 :(得分:1)

策略选择的持续位置取决于该策略传入或配置到User课程的位置/方式,而您并没有真正详述。

例如,如果您的User类具有以下内容:

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

...然后负责创建User的类可能必须将该首选项维持在User之外。

类似地,如果User对象simple保存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);
   }

}

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

RequestReceivedPolicyConfig policyConfig =  _currPolicy.getConfiguration();  

RequestReceivedPolicyConfig对象对User对象应该是不透明的,但内部可能是支持持久性的简单字典。然后,用户可以将其传递给持久层,而不必了解它。从持久层中提取它时,它用于使用提供程序重新安装RequestReceivedPolicy。在最小值,每个RequestReceivedPolicyConfig对象将包含RequestReceivedPolicy的类标识。

可以使用混合,其中策略是通过set / get推送的,但User对象也可以通过类似上面的PolicyProvider.getInstance().getPolicy(criteria)引入新策略,然后你仍然允许User对象采取基于RequestReceivedPolicyConfig方法的优势或保持外部持久性。

相关问题