示例:
class Person
{
@OneToMany
List<Action> actionHistory;
@ManyToOne
Employer employer;
private StateEnum myCurrentState = StateEnum.INITIAL_STATE;
}
想象一下这样的情况,其中有两件事是真的:
Person.myCurrentState需要根据actionHistory,雇主等的变化做出改变。有一组业务规则,例如“如果X行为显示在动作流中,当前状态为Y则设置为新状态为Z“
人员需要能够根据子当前状态阻止并允许对子进行某些操作。例如,可能无法在某些条件下更新雇主的职位,或者可能无法添加符合特定条件的操作。
最初我以为我会尝试通过Person中包含validation / reactionlogic的例程来管理对子进程的所有访问。结果是Person对象变得太大而且遍布整个地方,因为它需要监视多少个孩子的操作。 (即。而不仅仅是getAEmployer(),setNewEmployer()和那种东西,它也像updateJobTitleAtEmployer()等等)
将逻辑分散给孩子似乎同样凌乱。在这种情况下,雇主(例如)必须包含大量的引用回到它的父级。此外,与此相关的业务规则也散布在各地。
这个问题有什么干净的通用解决方案吗?我想要一些一般的方法,我可以让一个父类的兽医,并在某些情况下对其中许多孩子的某些状态变化作出反应。
更新: 我想我在这个问题上误用了“父母”和“孩子”这两个词。我正在使用它们:父母“有一个”孩子/父母“由孩子组成”。在示例中,Person将是父类,属性类将是子类。
更好的例子:
class Employee
{
private Contract contract;
private List<Action> actions;
private EmployeeState currentState = EmployeeState.INITIAL;
}
想象一下,在这种情况下,如果合同中的某些内容发生变化(例如,如果费率上升),则currentState可能会发生变化。如果员工处于某些州,也可能无法在合同上设置某些事项。在currentState更改的情况下,Contract属性只是更大计算中的一个因素(即状态可能由规则确定,例如“如果Contract.hourlyRate&gt; 30并且操作包含具有这些属性的Action而不是状态是......”)。
此外,在这种情况下,添加操作可能会更改Employee的状态,或者根据当前状态被阻止。
如果我遇到这些问题,我的模型可能有问题吗?
答案 0 :(得分:1)
根据我的理解,您可以使用Observer pattern来处理这种情况。在这种情况下,合同将订阅雇主,以便当雇主的状态发生变化时,合同将得到通知,并且可以根据当前状态自行完成。