2011-09-12 54 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_()(取決於您的具體實現)之前,將方法傳遞爲更具體或提供額外檢查。