2015-11-02 141 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()); 
}