一个设计模式问题

4
我正在设计一个应用程序,但是我无法确定正确的设计方案。我有一个想法,但它似乎不是GOF模式的一部分,因此我不确定是否采用这种方式是好的。
我的项目从可能的15-20个文档中创建数据(这些文档都是同一类型的,但数据可以变化很大)。一旦获取数据,就需要将其格式化为支持的4种格式之一并进行显示。此外,为了复杂化问题,即使文档本身被广泛分类为4-5种类型,其中几种文档(跨这些分类)也以类似的方式进行格式化。
现在,我将其分成以下几个部分:
数据创建
数据显示
数据创建创建具有通用接口的接口数据对象,该接口可以处理所有这些文档。
数据显示通过读取数据对象并按所需方式显示数据来完成。
我的第一个问题是- GOF模式集中没有看到这样的接口对象。采用这种方式是一个好的设计决策吗?
正如我之前提到的,只有两个文档以相似的方式进行格式化 - 跨分类。问题在于其他文档-本应以类似的方式进行格式化-却没有。因此,在某种情况下,我发现自己在克隆代码,而我不想这样做。
因此,我的第二个问题是-处理这种情况的最佳方法是什么?
如果有人能帮助我解决这个问题,我将非常感激。

你能给我们一些输入和输出的例子吗?这样会更容易让我们掌握事情的要领。 - APC
我认为现在考虑设计模式还为时过早。在我看来,先尝试制作一个可行的原型吧。 - Perpetualcoder
实际上,原型正在运行 - 我正在努力使其准备投入生产 :-) - Koran
4个回答

5
不要试图提前过度推动模式。先想出几个设计,然后尝试在其中揭示模式。模式的目的是沟通,并且只能被视为针对某些特定问题可重用。
因此,您的主要问题是拥有X个文档和Y个渲染。
- 尝试为有意义的文档生成类层次结构。您可能可以将一些逻辑因素分解到基类中或使用接口。 - 如果无法确定接口以抽象所有类型的文档,则可以依靠适配器来使各种文档适应给定的接口。 - 要拥有多个渲染器,可以查看访问者模式、装饰器模式或策略模式,或者使用实现相同接口的Y个渲染器的继承/多态性。这取决于变化的性质。 - 要根据用例获取正确的渲染器,可以使用工厂嵌入决策和实例化逻辑。
GoF模式比您的问题粒度更低。您将不得不找出与您非常特定的要求匹配的设计。如果有疑问,请始终选择最简单/最直观的设计。不要选择具有最多模式和花哨类层次结构的设计。
以上仅供参考。

我曾经考虑过使用适配器而不是接口对象,但我停止了,因为它似乎有些过度设计。目前,我在多个渲染器部分依赖于工厂模式。您认为我应该使用适配器而不是接口对象吗? - Koran
选择最简单的方式,可能是您情况下的界面。但请注意,如果不知道文档和渲染实际上是什么,就很难发表意见了。但是,如果有一些工作,并且它是一致且相对简单的(这似乎是您的情况),那么这可能已经足够好了。没有完美的设计。 - ewernli

1
听起来像是策略模式,整个应用程序采用MVC架构,但控制器有些退化。

同意。设置处理各种文档格式的策略,然后通过模型访问它们,使用控制器协调将数据创建为视图。 - Austin Hyde
其中一个问题是我只有两个相似的页面(它们跨越基本分类)。其他所有内容都依赖于分类和某些其他文档类型本身。因此,我不确定如何在这里使用策略模式。 - Koran

0

你的接口对象可以使用FacadeAdapter设计模式来描述。如果没有现有设计模式的直接匹配,也不要太担心 - 你所描述的解决方案是最好的选择。

对于第二个问题,你可以拥有一个基类,实现所有类共同的功能。然后为所有特殊需求进行扩展。我知道书籍推荐优先使用组合而非继承,但这并不是严格的规则,有些情况下继承是一个好的解决方案。


0
你有没有考虑使用建造者模式来创建数据?
建造者模式的意图是将复杂对象的构建与其表示分离,以便相同的构建过程可以创建不同的表示形式。
对于显示,你可以使用不同的装饰器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接