【问题标题】:Creating an object based on the subclasses of two other objects基于其他两个对象的子类创建对象
【发布时间】:2018-06-11 15:14:28
【问题描述】:

我的设计问题如下。

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

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

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

到目前为止,我能想到的唯一方法是在子类中进行枚举,这与这一点相悖,因为添加一个新的人或房间需要一个新的类和一个看起来很混乱的枚举类的变化.

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

我可能正在追求一些实际上无法实现的事情,但我不禁感到有一个很好的干净的解决方案就在我的掌握之外。

任何帮助将不胜感激。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    然而,第二件事是,当 composition 更适合您的需要时,您似乎正在尝试使用 inheritance。现在有了Person 继承 他的身份验证规则,该规则应该是Person 内的成员字段。所以,例如:

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

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

    【讨论】:

    • 我对这个解决方案的问题是它不能解决知识问题。使用此解决方案,该人包含的规则必须了解系统包含的每个资源,以便决定该用户是否具有访问权限,因为规则不同。因此,添加任何额外的资源都意味着更新每个用户子类。我认为我的设计传达得很糟糕,但我认为规则是由已经了解资源和人员类型的工厂创建的,但它只是暂时用于使用该资源对用户进行身份验证。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多