我遇到了一个应该使用域模型中的策略模式的示例。我有一个代表系统用户的用户类。每个用户可以在使用系统时接收请求。收到请求后,可能会有一些处理逻辑:
在这种情况下,似乎采用了策略模式。我有一个名为 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 :(得分: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
方法的优势或保持外部持久性。