基于另外两个对象的子类创建对象

时间:2018-06-11 15:14:28

标签: java oop design-patterns polymorphism class-design

我的设计问题如下。

我有两个类,每个类都有许多子类。我有一个工厂,需要根据每个对象的子类创建一个对象。

这是一个身份验证问题。工厂根据人员类型和他们希望访问的资源类型生成规则对象。该规则始终包含Allowallow,NeverAllow和timeBasedAllow子类。如果将来需要更复杂的访问系统,则有可能获得更多。

因此,在未来理想情况下,可以使用新的子类创建新人,新子类是具有新子类的新资源。可以使用新规则子类更改确定访问的参数,并且可以在规则工厂内更改每个人类型和房间类型的特定访问权限。

到目前为止,我能想到的唯一方法就是在子类中有一个枚举,这会使得这个点失败,因为添加一个新的人或者房间需要一个新的类,并且enum类的变化看起来很乱

我也非常热衷于保持数据和逻辑分离,所以我不能只将身份验证方法移到person类中,因为这需要person类知道有多少房型,这绝对不是理想的。

我可能会追求一些不切实际可行的东西,但我无法感觉到有一种很好的清洁解决方案。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

您的问题标题听起来好像您正在搜索多重感知,这在Java中是不允许的。与C ++不同,一个类可以extend一个且只有一个类。但是,Java也有interface,我怀疑这可能是你所寻求的。

interface类无法实例化,并且可能具有抽象方法。一个 具体类可以implement尽可能多的接口,具体类必须实现接口声明的每个抽象方法。抽象类也可以实现接口,而它们未实现的抽象方法必须通过扩展它们的具体类来实现。

我建议将您的身份验证方法提取到interface,也许称为AuthRule或其他人。 AuthRule可以使用表示身份验证的抽象方法,而不会暴露用于身份验证的确切样式。因此,您需要实施AlwaysAllow implements AuthRule,然后authenticate上的AlwaysAllow方法将始终返回true

然而,第二件事是,当合成更符合您的需求时,您似乎尝试使用继承。现在,如果Person 继承他的身份验证规则,那么该规则应该是Person内的成员字段。所以,例如:

class Person extends User {
  AuthRule rule;
  Person(AuthRule myrule) {
    rule = myrule;
  }

  bool authenticate(...) {
    return rule.authenticate(...);
  }
}

如果您遵循基于将对象注入其他对象的设计模式以混合您期望的功能,您的代码将变得更加可用和可扩展。我希望这可以帮助你解决问题。