在影响父状态时处理子对象状态

时间:2011-04-18 16:47:22

标签: java oop design-patterns

示例:

class Person
{        
    @OneToMany
    List<Action> actionHistory;

    @ManyToOne
    Employer  employer;

    private StateEnum myCurrentState = StateEnum.INITIAL_STATE;
 }

想象一下这样的情况,其中有两件事是真的:

  1. Person.myCurrentState需要根据actionHistory,雇主等的变化做出改变。有一组业务规则,例如“如果X行为显示在动作流中,当前状态为Y则设置为新状态为Z“

  2. 人员需要能够根据子当前状态阻止并允许对子进行某些操作。例如,可能无法在某些条件下更新雇主的职位,或者可能无法添加符合特定条件的操作。

  3. 最初我以为我会尝试通过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的状态,或者根据当前状态被阻止。

    如果我遇到这些问题,我的模型可能有问题吗?

1 个答案:

答案 0 :(得分:1)

根据我的理解,您可以使用Observer pattern来处理这种情况。在这种情况下,合同将订阅雇主,以便当雇主的状态发生变化时,合同将得到通知,并且可以根据当前状态自行完成。