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



我的设计问题如下。

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

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

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

到目前为止,我能想到的唯一方法是在子类中有一个枚举,这违背了重点,因为添加新的人或房间需要一个新类和枚举类的更改,这看起来很混乱。

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

我可能追求一些不切实际实现的东西,但我忍不住觉得有一个很好的干净解决方案就在我掌握之中。

任何帮助将不胜感激。

你的问题标题听起来好像你在搜索多重继承人,这在 Java 中是不允许的。与C++不同,一个类可能extend一个且只有一个类。但是,Java也有interface,我怀疑这可能是你想要的。

interface类不能实例化,并且可能具有抽象方法。一个 具体类可以根据需要implement任意数量的接口,并且具体类必须实现接口声明的每个抽象方法。抽象类也可以实现接口,它们不实现的抽象方法必须由扩展它们的具体类实现。

我建议将您的身份验证方法提取到interface中,也许称为AuthRule或类似的东西。AuthRule可以具有表示身份验证的抽象方法,而不会公开用于身份验证的确切样式。因此,您将实现AlwaysAllow implements AuthRule然后AlwaysAllow上的authenticate方法将始终返回true

然而,第二件事是,你似乎在尝试使用继承,而组合更适合你的需求。现在,如果Person继承他的身份验证规则,该规则应该是Person中的成员字段。因此,例如:

class Person extends User {
AuthRule rule;
Person(AuthRule myrule) {
rule = myrule;
}
bool authenticate(...) {
return rule.authenticate(...);
}
}

如果您遵循一种设计模式,即将对象注入其他对象以混合所需的功能,则代码将变得更加可用和可扩展。我希望这对您的问题有所帮助。

最新更新