2015-11-02 71 views
2

我是新來的設計模式,我有以下需求:我有一組由DTO對象表示的事件集合:LateEventDTO,RescheduleEventDTO等。每個DTO對象都有自己的一組屬性。現在,我有一個名爲EventDTO的抽象類,並且所有不同類型的DTO對象(如LateEventDTO,RescheduleEventDTO等)都擴展了EventDTO。顯示DTO對象的設計模式

我將傳遞這些DTO對象之一到我的UI層(jsp頁面),該層檢查它是什麼類型的DTO對象。像這樣:

if(event instance of Late){ 
    //handle late event and display it's content 
} 

else if(event instance of Reschedule){ 
    //handle reschedule event and display it's content 
} 

等等等等。

我想要的是使表示層不知道不同類型的eventDTO對象。它需要做的就是獲取一個通用對象並顯示它的內容。它不應該像上面顯示的那樣明確地檢查它的類型。

這種情況下最好的設計模式是什麼?

+0

我會考慮有關*策略模式* –

+1

你應該重新設計IMO的東西,這樣你就不會存在這樣的問題:剛1個界面爲你的DTO所以你不需要檢查的實例。 – zapl

回答

-1

那麼,如果你有一個頁面,並且你想要顯示具有不同屬性的不同類,你必須指定哪個屬性應該顯示在JSP頁面的哪個位置。

一種方法是讓JSP頁面能夠理解你有一些「始終顯示」變量的對象,然後是某種你想顯示的「其他」屬性列表。

問題是 - 如何將這些DTO映射到這個新對象?構造函數是一個答案(是的,還需要一些手動工作)。

public class JspUndestandableClass(){  

    public JspUndestandableClass(LateEventDTO lateEventDTO){ 
     .... 
    } 

    public JspUndestandableClass(RescheduleEventDTO rescheduleEventDTO){ 
     .... 
    } 
} 

然後,您可以簡單地在控制器中創建這些對象,並將它傳遞給JSP頁面。 PS:設計模式顯示瞭解決某些問題的好方法,但它們並不能保存你自己(即在錯誤的用例中使用它們),它們不涵蓋所有情況。

+0

如果你想渲染一個基類型「EventDTO」的對象(你很可能想要),你仍然必須通過先前的'instanceof'檢查來投射這個對象來調用其中一種方法。 – Kai

+0

@ user714965 - 您始終可以在上下文中創建JspUnderstandableClass,在此類型將其轉換爲EventDTO之前知道該類型。 – libik

+0

OP有'instanceof'檢查我假設類型是未知的。假設有一個來自您要顯示的數據庫層的'List '。你會怎麼做? – Kai

3

使相干類,而不是DTO的

這將解決abstract class多態性這個誤用。

擴展abstract class是策略模式(see @Crazy Ninja comment)。 abstract class而不是interface不會讓它變得更少。

擴展抽象類的要點是每個實例都可以被處理。如果你必須弄清每個實例是什麼類型的,那麼爲什麼要麻煩呢?


如果下面不符合您的設計需要,您還需要做出協調一致的類 - 即做一些事情,而不是僅僅包含字段/屬性的類。


P.S.這可能不是有效的Java語法。

您的代碼應該看起來更像是這樣的:

public abstract EventBase { 
    // declare common properties here. 

    public virtual void Handle() { 
     // code to handle the properties. 
     // maybe there is some behavior for the base properties. 
    } 

    // Depending on how you're going to display contents, you 
    // may want to override toString() 

    public override string toString() { 
     // format the DTO thingies as needed. 
    } 
} 

public class RescheduleEvent extends Eventbase { 
    // define RescheduleEvent unique properties here 


    public override string toString(){ 
     string whoAMI = base.toString(); 
     whoAMI = whoAMI + ..... 
     return whoAMI; 
    } 

    public override void Handle() { 
     base.Handle(): 

     // do stuff 
    } 
} 

// client code. 
myRescheduleEvent.Handle(); 
myWhateverEvent.Handle(); 

// or 

foreach(Eventbase anEvent in eventList) { 
    anEvent.Handle(); 
    DisplaySomething(anEvent.toString()); 
}