Java 显示DTO对象的设计模式
我是设计模式的新手,我有以下需求:我有一组由DTO对象表示的事件,如:LateEventDTO、RescheduleeEventTo等。每个DTO对象都有自己的属性集。现在,我有一个名为EventDTO的抽象类,所有不同类型的DTO对象,如LateEventDTO、rescheduleeventdo等,都扩展了EventDTO 我将把其中一个DTO对象传递给我的ui层(jsp页面),该层检查它是什么类型的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
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());
}