我是设计模式的新手,我有以下需求:我有一组由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对象。它需要做的就是获得一个通用对象并显示它的内容。它不应该像上面显示的那样明确地检查它的类型。
这种情况的最佳设计模式是什么?
答案 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:设计模式显示了解决某些问题的好方法,但它们本身并不能保存(即在错误的用例中使用它们)并且它们并不能涵盖所有情况。