java - 多态性和 n 层应用程序

标签 java model-view-controller oop n-tier-architecture

这个疑惑由来已久。。。希望大家赐教。

假设我的模型中有 3 个类。

abstract class Document {}
class Letter extends Document {}
class Email extends Document {}

和一个带有返回文档(信件或电子邮件)方法的服务类。

class MyService {
    public Document getDoc(){...}
}

所以在我的 Controller 中,我想显示 MyService 返回的文档,并且我希望使用电子邮件 View 和信件 View 来显示它。 Controller 如何知道调用哪个文档 View ? letterView 还是 emailView?

我经常在 Controller 上做一个 if 语句来检查服务层收到的文档的类型......但是我认为从 OOP 的角度来看这不是最好的方法,如果我实现一些 boolean 值方法Document.isLetter(), Document.isEmail() 解决方案本质上是一样的。

另一件事是以某种方式将 View 选择委托(delegate)给文档。像这样的东西:

class MyController {
    public View handleSomething() {
        Document document = myService.getDocument();
        return document.getView();
    }
}

但是,我的天哪,为什么我的模型对象必须知道关于 View 的任何信息?

感谢任何人:)

最佳答案

这是一个很好的问题。这里有不止一种合理的方法;您必须权衡取舍并做出适合您情况的选择。

(1) 有人会争辩说 Document 接口(interface)应该为实例提供一种方法来呈现它们自己。从 OO 的角度来看,这是很有吸引力的,但是根据您的 View 技术,加载具有 JSP、Swing 组件或其他知识的具体文档类(可能是简单的域模型类)可能不切实际或非常丑陋。

(2) 有些人会建议在 Document 上放置一个 String getViewName() 方法,例如返回可以正确呈现的 JSP 文件的路径文档类型。这在一个层面上避免了 #1 的丑陋(库依赖性/“繁重的”代码),但在概念上提出了同样的问题:您的域模型知道它正在由 JSP 呈现并且它知道您的 webapp 的结构。

(3) 尽管有这些要点,但最好您的 Controller 类知道宇宙中存在哪些类型的文档以及Document 的每个实例属于哪种类型至。考虑在某种基于文本的文件中设置某种 View 映射:.properties 或 .xml。你用 Spring 吗? Spring DI 可以帮助您快速指定具体文档类和呈现它们的 JSP/ View 组件的映射,然后将其传递给 Controller ​​类的 setter /构造函数。这种方法允许:(1) 您的 Controller 代码保持与 Document 类型无关,以及 (2) 您的域模型保持简单且与 View 技术无关。它以增量配置为代价:.properties 或 .xml。

我会选择 #3 或者——如果我的预算(及时)用于解决这个问题——我会 (4) 简单地硬编码 Document 的一些基本知识> 在我的 Controller 中输入(正如你所说的你现在正在做的那样),以便在下次由于 OO 特性不够理想而被迫更新我的 Controller 时切换到#3。事实上,#s 1-3 比 #4 花费的时间更长,也更复杂,即使它们“更正确”。坚持#4 也是对 YAGNI Principal 的认可。 :不确定您是否会经历#4 的负面影响,为避免这些负面影响而预先付出代价是否有意义?

关于java - 多态性和 n 层应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2276102/

相关文章:

java - 如何从构造函数中获取值到方法中?

java - 文件解密时 JPEG 字节加密返回错误图像

Java泛型——获取泛型参数的实际类型

java - 如何更改 Eclipse 中的 "Dynamic Web Project"默认源和输出文件夹?

php - 在 SQLITE SELECT 语句中使用的自定义 REGEXP 函数

Symfony 最佳实践 : Where to place these constants?

css - yii2 中的下拉列表在添加样式属性时失败

javascript - "' 未定义 ' is not a function"错误

java - JTextPane 从文本文件读取

java - 在 Jasper Reports 中迭代 JRBeanCollectionDataSource 时如何获取当前 bean?