【问题标题】:Verifying Objects using Java interfaces使用 Java 接口验证对象
【发布时间】:2011-09-12 17:27:03
【问题描述】:

我目前面临一个设计问题,希望得到有关如何解决它的建议:

问题

我将用一个例子来说明我的问题注意这只是一个例子:

假设您有一个名为 Pass 的接口,其中列出了方法:

public interface Pass {
  public boolean hasPassedA();
      public boolean hasPassedB();
      public boolean hasPassedC();
}

假设你有一个类实现了 Assessor 这个接口:

public class Assessor implements Pass{
// how should I implement this class ?? 
}

最后是学生课:

public class Student {
  // some code that defines student behaviour not important.
}

那么问题是如何使 Assessor 和学生对象之间的交互更加灵活?

我注意到 Assessor 对象应该是抽象的,因为实际上没有 Assessor 这样的东西,而是您有不同类型的评估者,例如数学评估者或英语评估者等,而这反过来将允许我创建不同类型的 Assessor 对象,例如

MathAssessor extends Assessor
EnglishAssessor extends Assessor

这个概念是,如果在 Pass 接口中声明的所有方法都返回 true,并且 subjectAssessor 类中的所有其他方法都返回 true,则 Student 可以通过。

我在 Assessor 课上做什么?我读过适配器设计模式,但还没有完全理解这个概念,或者它甚至适用于这种情况吗?

【问题讨论】:

  • Assessor 的方法不应该将Student 对象作为参数吗?还是每个学生都有自己的一群评估员(即每个评估员只有一个学生)?
  • 好吧,对于这个特定的例子,让我们假设一个评估员评估一个学生,例如Assessor 评估员 = new MathsAssessor(student);

标签: java interface design-patterns


【解决方案1】:

首先,您拥有的Pass 界面不是很灵活,这可能会造成困难。例如,如果 Pass 的一个实现只需要 hasPassedA,或者您有一个需要 hasPassedA、hasPassedB、hasPassedC 和 hasPassedD 的实现,该怎么办。然后各种类型的评估员将需要弄清楚要检查的通过条件。

执行此操作的更灵活的方法可能是执行类似的操作。与其拥有 Pass 接口,不如使用 Condition 接口(应更改类/接口的名称以对您的域有意义)。

public interface Condition {

   // true means the condition passed, false means it did not
   boolean evalutate();
}

现在你可以有一个 Assessor 类(我不确定这是否正是你的 Assessor 的工作方式,但这只是一个指导方针):

public class Assessor {

   boolean assess(Collection<Condition> conditions) {
      for (Condition c : conditions) {
        if (!c.evaluate()) {
           return false;
        }
      }
      // all conditions passed
      return true;
   }
}

希望这对您的问题有所帮助。

【讨论】:

  • 此方案的一个变体可能是使条件成为构造函数参数。因此,不同的 Assessors 仅因适用的条件而异。评估方法可能需要一个 Student 参数。
  • 这样也行。我不知道 Assessors 在他们的评估方法中是否会有不同的逻辑,或者学生是否知道它的条件,但听起来确实更有意义的是 assessor.assess(student)。
  • 是的,这是我最初的想法,因为强制执行某种形式的聚合是有意义的。学生对象将作为参数传递到哪里。
  • “例如,如果 Pass 的一个实现只需要 hasPassedA,或者您有一个需要 hasPassedA、hasPassedB、hasPassedC 和 hasPassedD 的实现,该怎么办。然后各种类型的评估员将需要弄清楚要检查哪些通过条件。”情况并非如此,所有 pass 的实现都需要 hasPassedA、hasPassedB ... 等
  • 我相信我想要实现的关键是评估器对象和任何扩展它的类,但我不确定如何编写接口之间的交互,它的实现和实现的子类。
【解决方案2】:

首先,回答您关于适配器模式的问题,这里不适用。您使用适配器模式在 2 个不兼容的系统之间添加一个层,以允许它们来回传递数据。

使用您的示例,我建议在 Assessor 中编写 hasPassed_() 方法的默认实现,即使该实现只不过是抛出一个新的 UnsupportedOperationException (回答有关如果特定 Assessor 只需要hasPassed_() 方法,您可以只覆盖您需要的方法)。您可以修改主题评估者(例如 MathAssessor、EnglishAssessor 等)的 Pass 方法以更具体或在调用 super.hasPassed_() 之前提供额外检查(取决于您的具体实现)。

【讨论】:

    猜你喜欢
    • 2020-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多