显示DTO对象的设计模式

时间:2015-11-02 15:23:49

标签: java design-patterns

我是设计模式的新手,我有以下需求:我有一组由DTO对象表示的事件,如:LateEventDTO,RescheduleEventDTO等。这些DTO对象中的每一个都有自己的一组属性。现在,我有一个名为EventDTO的抽象类,所有不同类型的DTO对象,如LateEventDTO,RescheduleEventDTO等,都会扩展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对象。它需要做的就是获得一个通用对象并显示它的内容。它不应该像上面显示的那样明确地检查它的类型。

这种情况的最佳设计模式是什么?

2 个答案:

答案 0 :(得分: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());
}

答案 1 :(得分:-1)

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

一种方法是让对象JSP页面了解你有哪些"总是显示"变量然后某种类型的"其他"您想要展示的属性。

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

public class JspUndestandableClass(){    

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

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

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

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