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

标签 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. 人员需要能够根据其当前状态阻止和允许对子级的某些操作。例如,在某些情况下可能无法更新雇主的职位,或者可能无法添加满足特定条件的操作。

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

不过,将逻辑传播给 children 似乎同样困惑。在这种情况下,雇主(例如)必须包含大量对其父级的引用。而且与这些东西相关的业务规则也分散在各处。

这个问题有什么干净的通用解决方案吗?我想要一些通用的方法,让我可以拥有一个父级 vert ,并在某些情况下对其许多子级的某些状态变化使用react。

更新: 我认为我在这个问题中错误地使用了“ parent ”和“ child ”这两个术语。我这样使用它们:父级“有一个”子级/父级“由子级组成”。在示例中,Person 是父类,属性类是子类。

更好的例子:

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

    private EmployeeState currentState = EmployeeState.INITIAL; 
}

想象一下,在这种情况下,如果合约中的某些内容发生变化(例如,如果利率上升),则 currentState 可能会发生变化。如果员工处于某些州,也可能无法在契约(Contract)中设置某些内容。在 currentState 发生变化的情况下,Contract 属性只是更大计算中的一个因素(即状态可能由诸如“如果 Contract.hourlyRate > 30 并且操作包含具有这些属性的操作而不是状态...”之类的规则确定。

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

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

最佳答案

据我了解,您可以使用Observer pattern对于这种情况。在这种情况下,Contract 会订阅 Employer,这样当 Employer 的状态发生变化时,Contract 就会收到通知,并根据当前状态做自己的事情。

关于java - 当子对象状态影响父状态时处理它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5706137/

相关文章:

java - JComponent 未注册

java - gRPC 服务器能否立即回收 DEADLINE_EXCEEDED 线程?

c++ - 对父类中方法的 undefined reference

ruby - 常量与按需实例化的对象——哪个最优?

c# - 如何消除 Switch 语句?

java - 每小时英里计算器

c++ - 返回一个指针数组?

php - 计费系统最佳实践

java - 尝试使其他包装类对复合类方法可见时,避免违反SOLID原则

java - 从 Google 应用引擎提供 dart Web 应用程序