Java 显示DTO对象的设计模式

Java 显示DTO对象的设计模式,java,design-patterns,Java,Design Patterns,我是设计模式的新手,我有以下需求:我有一组由DTO对象表示的事件,如:LateEventDTO、RescheduleeEventTo等。每个DTO对象都有自己的属性集。现在,我有一个名为EventDTO的抽象类,所有不同类型的DTO对象,如LateEventDTO、rescheduleeventdo等,都扩展了EventDTO 我将把其中一个DTO对象传递给我的ui层(jsp页面),该层检查它是什么类型的DTO对象。像这样: if(event instance of Late){ //han

我是设计模式的新手,我有以下需求:我有一组由DTO对象表示的事件,如:LateEventDTO、RescheduleeEventTo等。每个DTO对象都有自己的属性集。现在,我有一个名为EventDTO的抽象类,所有不同类型的DTO对象,如LateEventDTO、rescheduleeventdo等,都扩展了EventDTO

我将把其中一个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不敏感。它所需要做的就是获取一个通用对象并显示它的内容。它不应该像上面显示的那样显式地检查它的类型


对于这个场景,什么是最好的设计模式

如果您有一个页面,并且希望显示具有不同属性的不同类,那么您必须指定哪个属性应该显示在JSP页面中的哪个位置

一种方法是让JSP页面了解您在哪里有一些“始终显示”变量,然后是一些您想要显示的“其他”属性的列表

问题是-如何将这些DTO映射到这个新对象中?构造器是一个答案(是的,还需要一些手工工作)

然后,您可以简单地在控制器中创建这些对象,并将其传递到JSP页面


PS:设计模式显示了解决某些问题的好方法,但它们并不能节省您的时间(即在错误的用例中使用它们),并且它们不能涵盖所有情况。

创建连贯的类,而不是DTO

这将修复
抽象类
多态性的错误应用

扩展
抽象类
是策略模式()<代码>抽象类而不是
接口
并不会让它变得不那么简单

扩展抽象类的目的是使每个实例都能得到相同的处理。如果您必须弄清楚每个实例是什么类型的,那么为什么还要麻烦呢


如果下面的内容不能满足您的设计需要,您仍然需要创建一致的类—这些类可以做一些事情,而不仅仅包含字段/属性


注意:这可能不是有效的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());
}

我会考虑Strategy PatternYou应该IMO重新设计的东西,所以你不存在这个问题:只有1个接口为你的DTOS,所以你不需要一次检查。如果你想呈现一个对象的基础类型<代码> Endodto(你最可能想要的),你仍然必须投对象(使用先前的
实例进行检查)调用其中一个方法。@user714965-您可以始终在上下文中创建JspUnderstandableClass,在将其转换为EventDTO之前,您知道该类型。OP有
instanceof
检查,我假设该类型未知。假设有一个
列表
来自您想要显示的数据库层。您会怎么做?@user714965-他说“我将把这些DTO对象中的一个传递到我的ui层”。这个解决方案显然不适用于祖先列表。重点仍然是:你需要一个
实例来知道你需要调用哪个方法。如果你想知道类型,这个问题将是多余的。
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());
}