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

原文 标签 java oop design-patterns

例:

class Person
{        
    @OneToMany
    List<Action> actionHistory;

    @ManyToOne
    Employer  employer;

    private StateEnum myCurrentState = StateEnum.INITIAL_STATE;
 }


想象这样的情况,其中有两件事是正确的:


Person.myCurrentState需要更改以响应操作历史,雇主等的更改。有一组业务规则,例如“如果类型X的操作出现在操作流中,并且当前状态为Y,则将新状态设置为Z”
人员需要能够根据其当前状态来阻止并允许对其进行某些操作。例如,在某些情况下,可能无法在Employer上更新职位,或者可能无法添加符合某些条件的操作。


最初,我以为我会尝试通过包含验证/反应逻辑的Person例程将所有对子级的访问集中到一起。结果是Person对象变得太大而到处都有,因为它需要监视多少个孩子操作。 (即,不仅仅是getAEmployer(),setNewEmployer()之类的东西,还包括updateJobTitleAtEmployer()等)

然而,将逻辑传播给孩子们似乎也很混乱。在这种情况下,例如,雇主必须包含大量返回给其父公司的引用。与此相关的业务规则也散布在各处。

是否有解决此问题的常规方法?我想要一些通用的方法来拥有Parent类的兽医,并且在某些情况下会对它的许多子级中的某些状态发生反应。

更新:
我认为我在这个问题中误用了“父母”和“孩子”这两个词。我这样使用它们:父母“有一个孩子” /父母“由孩子组成”。在该示例中,Person将是父类,而属性的类将是子类。

更好的例子:

class Employee
{
    private Contract contract;
    private List<Action> actions;

    private EmployeeState currentState = EmployeeState.INITIAL; 
}


假设在这种情况下,如果Contract中的某些内容发生更改(例如,利率上升),currentState可能会更改。如果雇员处于某些状态,则可能还无法在合同上设置某些内容。在currentState发生变化的情况下,Contract属性只是更大计算中的一个因素(即状态可能由“ if Contract.hourlyRate> 30并且action包含这些属性的动作比state为...的规则来确定”)。

同样,在这种情况下,添加操作可能会更改Employee的状态,或根据当前状态被阻止。

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

最佳答案

据我了解,您可以在这种情况下使用Observer pattern。在这种情况下,合同将订阅雇主,以便当雇主的状态发生变化时,合同将得到通知,并且它可以基于当前状态来做自己的事情。

相关文章:

java - 如何从CompletableFuture中设置文本

c# - 内部类的成员可以覆盖吗?

design-patterns - 有哪些常见的3D游戏模式?

java - Android中的网络是否可用?

java - Struts 2 Acion类多实例

ruby-on-rails - 单一责任原则-何时停止将代码提取到单独的类中

c++ - 扩展此C ++工厂实现的最佳方法?

java - Java应用程序中的Maker-Checker-Approver

java - 有关Java方法的递归返回的问题[重复]

java - 在什么情况下可以在另一类的对象上调用一类的方法?