【问题标题】:Strategy pattern in domain model领域模型中的策略模式
【发布时间】:2012-11-01 19:13:19
【问题描述】:

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

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

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

【问题讨论】:

  • 视情况而定。您需要RequestReceivedPolicy 实例的详细信息,还是只需要了解与用户相关联的接收请求策略类型?
  • @neontapir 由于每种策略类型都有处理所需的相关信息,我认为我需要这些信息和策略类型。
  • 建立一个使用数据表示逻辑模型的标准,就像规则引擎一样。我认为这个概念有一个术语,但我想不出一个名字。基本上,您希望您的控制器以数据的形式使用模型指令,然后您将其持久化取决于您。如果我正确理解您的问题。
  • @foampile 对不起,我不明白你的评论。你能给我一些例子或资源吗?
  • 我所说的“使用数据表示逻辑模型的标准”的意思是,不是在应用程序层中编写业务逻辑,而是建立一个通过数据定义逻辑的约定,有点像你自己的4GL,您将通过它向控制器传递指令,控制器根据这些指令告诉它做什么来做不同的事情。另外,请查看:en.wikipedia.org/wiki/Convention_over_configuration

标签: design-patterns strategy-pattern


【解决方案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 的方法或保持外部持久性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 2014-01-05
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 2013-12-30
    • 1970-01-01
    相关资源
    最近更新 更多