基于聚合的体系结构问题

时间:2015-03-27 09:26:56

标签: c++ design-patterns architecture aggregation

我再次需要你的帮助。

我有一个文档查看器应用程序,可以读取两种不同的文档:

  1. 特别一个(基于PDF,带有自定义标题)
  2. Standart one(" raw" PDF)。
  3. 使用原始PDF查看器应该像任何其他人一样 使用自定义 - 在其打开期间执行一些其他操作,这些操作不适用于原始PDF 这些操作应在稍后的应用程序菜单中提供。仅适用于自定义文档。

    Project OOP架构(由其他人设计)看起来像这样:

    class GenericDocument
        class PdfLibDocument
            class CustomDocumentHighLevel
                class CustomDocumentLowLevel
    

    即。每个更高级别的类包含作为成员的低级别:

    class GenericDocument
    {
       SmartPointer< PdfLibDocument > m_document;
       ...
    };
    

    等等。

    自定义文档具有更多特定的功能:

    class CustomDocumentLowLevel
    {
         public:
            void DoSomeBlackMagic();
            ...
            // Another black magic
    };
    

    出现问题然后我需要&#34;拉&#34;从CustomDocumentLowLevelGenericDocument的某种低级方法(在应用菜单中显示) - 因为我需要将此方法添加到所有四个类中! 可能在未来我需要&#34;拉&#34;自定义文档中的更多方法 看起来这种软件架构在这种情况下是不好的选择,不是吗?

    所以我需要找到一种方法来重构这段代码。我应该用继承替换聚合吗?介绍接口?

1 个答案:

答案 0 :(得分:1)

通常,组合比继承更受欢迎,但它似乎不适用于您的情况。为什么不从彼此继承观众?使用简单的功能创建一个基本查看器,全部可用,然后继承添加新功能的专用查看器。

对于与之相关的菜单和操作,它们应该表示为单独的对象。检查Command模式。

UI可以从您的查看者请求可用的命令列表。每个查看器都可以在初始化或构造或任何您选择的内容中填充其内部命令列表。