![]() |
1
11
这是个很好的问题。这里有不止一种可行的方法;你必须权衡取舍,做出适合你情况的选择。 (1)有人认为文档接口应该为实例提供一种自我呈现的方法。从面向对象的角度来看,这是很有吸引力的,但是根据您的视图技术,加载您的具体文档类(可能是简单的域模型类)并了解jsp、swing组件或其他东西可能是不切实际的,或者是非常难看的。
(2)有些人建议
(3)尽管有这些问题,但最好是你的控制器类
不
知道宇宙中存在哪些类型的文档,以及每个实例的类型
我会选择3或者——如果我处理这个问题的预算(及时)很小——我会(4)简单地硬编码一些基本知识
|
![]() |
2
2
你的控制器
不应该
知道。它应该问
想象一下,如果在后期添加一个新的
或许它可以独立完成。例如
也许它能做到 结合 以双重调度机制为例
无论哪种情况,电子表格/信件/电子邮件都将实现这一点
|
![]() |
3
2
我不确定,但是您可以尝试添加一个基于函数重写的工厂类,并假定根据文档类型返回一个视图。例如:
|
![]() |
4
1
也许你可以
|
![]() |
5
1
我在工作中见过很多次这种“模式”,也见过很多解决方法。说到重点,我建议
这将执行所需的映射,同时促进关注点的分离[soc]
作为使用示例,请考虑以下内容
|
![]() |
6
1
访问者模式可能在这里工作:
visitor是比较有争议的模式之一,尽管有许多变体试图克服原始模式的限制。 如果“接受”(…)方法可以在文档中实现,那么实现起来更容易,但是模式依赖于“这个”参数的静态类型,所以我认为Java中不可能做到这一点——在这种情况下,您必须重复自己,因为静态的“这”取决于类。保持执行。 如果文档类型的数量相对较少且不太可能增长,并且视图类型的数量更可能增长,那么这将起作用。否则,我会寻找一种方法,使用第三类来协调显示,并试图保持视图和文档的独立性。第二种方法可能是这样的:
viewmanager的目的是将文档实例(如果只有一个给定类型的文档可以打开,则为文档类型)与视图实例(如果只有一个给定类型的视图可以打开,则为视图类型)相关联。如果文档可以有多个关联视图,那么viewmanager的实现将如下所示:
视图文档关联逻辑取决于应用程序。它可以是简单的,也可以是复杂的。关联逻辑封装在viewmanager中,因此应该相对容易更改。我喜欢DrewWills在他的回答中关于依赖注入和配置的观点。 |
![]() |
7
1
首先,德鲁·威尔斯的反应非常好——我是新来的,我还没有资格投票,否则我会的。 不幸的是,这可能是我自己的经验不足,我不认为你会避免妥协一些分离的关注。有些东西必须知道要为给定的文档创建什么样的视图——这是不可能的。 正如Drew在第3点中指出的那样,您可以使用某种外部配置来指示系统在哪个视图类上使用哪个文档类型。Drew的Point 4也是一个不错的方法,因为即使它打破了开放/封闭原则(我相信这是我正在考虑的原则),如果您只打算使用少量的文档子类型,那么它可能不值得大惊小怪。 对于后一点的变体,如果要避免使用类型检查,可以实现依赖于文档子类型映射来查看实例的工厂类/方法:
当然,当需要向映射添加新视图时,您仍然需要编辑initializeviews方法——因此它仍然违反了ocp——但至少您的更改将集中到工厂类,而不是控制器内部。 (我相信在这个例子中有很多地方可以调整——比如验证——但是它应该足够好,能够很好地了解我正在做的事情。) 希望这有帮助。 |
![]() |
8
1
想做就做!
…
没别的了! |
![]() |
9
0
扩展服务以返回文档类型:
在更面向对象的方法中,使用viewfactory返回电子邮件和信件的不同视图。将视图处理程序与ViewFactory一起使用,您可以询问每个处理程序是否可以处理文档:
使用此工厂,添加新视图类型时不需要更改工厂类。视图类型可以检查它们是否能够处理给定的文档类型。如果不能返回空值。否则,它们可以返回所需的视图。如果没有视图可以处理您的文档,则返回null。 viewhandlers非常简单:
|
![]() |
Schadre · C-plus编码错误 2 年前 |
![]() |
Nithin K · 即使类属性的类型正确,也会获取异常 2 年前 |
![]() |
amirreza870 · Python OOP-更改类文本 2 年前 |
![]() |
A_K · 使用cat或打印方法打印部分内容的子集闭包 2 年前 |
![]() |
Mo Fatah · 如何使用Python类打印数独板? 2 年前 |