2011-09-12 53 views
3

我目前面临的一个设计问题,也会对我怎么能解决这个问题体会咨询验证对象一个例子:使用Java接口

假设你已经上市的名为山口与方法的接口:

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

假如你有一个实现这个INTE类rface称为评估员:

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

最后Student类:

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

接下来的问题是如何才能让评税主任和学生之间的互动对象有很多更灵活?

我注意到一个Assessor对象应该是抽象的东西,因为实际上没有Assessor这样的东西,但是您有不同类型的评估者,比如Math Assessor或English Assessor等等,它们在转动将允许我创建不同类型的Assessor对象,例如

MathAssessor extends Assessor 
EnglishAssessor extends Assessor 

的概念是,一个学生可以通过,如果在通界面返回声明的所有方法一样,并在subjectAssessor类的所有其他方法返回true。

评估师课程我该做什么?我已经阅读过适配器设计模式,但还没有完全理解这个概念,还是它适用于这种情况?

+0

Assessor的方法不应该把'Student'对象作为参数吗?或者让每个学生都有自己的评估者(即每个评估者只有一名学生)? –

+1

对于这个特定的实例,我们假设一个评估者评估一个学生, 例如评估者评估员=新的MathsAssessor(学生); – BOWS

回答

2

首先,你的接口Pass不是很灵活,这可能会造成困难。例如,如果Pass的一个实现只需要hasPassedA,或者您有一个需要hasPassedA,hasPassedB,hasPassedC和hasPassedD的实现。然后,各种类型的评估者将需要确定要检查的通过条件。

更灵活的方法来做到这一点可能是做这样的事情。而不是拥有一个Pass接口,也许就像一个Condition接口(类/接口的名称应该被改变以使你的域名有意义)。

public interface Condition { 

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

现在你可以有一个评估机构类(我不知道这是否正是您的评审员是如何工作的,但它只是一个指导方针):

public class Assessor { 

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

希望这有助于为您问题。

+1

该方案的一个变体可能是使条件成为构造函数的参数。因此,不同的评估者仅因其适用的条件不同而不同。评估方法可能需要学生参数。 –

+0

这也可以。我不知道评估者在评估方法中是否有不同的逻辑,或者学生是否知道其条件,但听起来评估者评估(学生)更有意义。 –

+1

是的,这是我最初的想法,因为它可以强制执行某种形式的聚合。学生对象将被作为参数传递给哪里。 – BOWS

0

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

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