2

在下面的类图中,我尝试使用 Bridge 设计模式来实现一个简单的文档创建器应用程序。具体的“DocMakers”负责文档布局,但他们每个人都接受一个“IFileFormat”来将每个文档生成为不同的格式

我的问题是,如果它是 PDF,我希望能够以特殊方式修改文档

我希望这个特殊的 PDF 功能在文档创建结束时发生,无论它是 DocMakerLayoutA 还是 DocMakerLayoutB,但由于一切都由接口控制,我似乎找不到它的位置。

如果我将函数“DoSomethingSpecialForPDF”添加到“IDocMaker”,它会起作用,但对于“FileFormarBMP”类,我必须让它不执行任何操作。这似乎是糟糕的设计。

我从一开始就设计错了这个东西,还是有办法用这种结构做到这一点?

使用桥接设计模式的示例类图

4

1 回答 1

1

当您需要分离抽象和实现时,桥接模式是合适的。在您的情况下,您需要抽象地查看文件创建,因此Layout不得了解具体File属性。因此,当您使用桥接模式时,您不能为特殊实现假设特殊行为。

在您的情况下,您可以假设任何File在文档创建后都具有功能,因此您可以添加一个doAfter()方法IFileFormat并在两个具体PDFBMP. 在 , 在 的情况下PDF,doAfter()你打电话doSomthingSpecialForPdf和在BMP你什么都不做的情况下。

你可能会说它看起来像糟糕的设计:),但实际上你现在有了桥接模式的好处(两侧的独立变化),如果你一开始就这么想的话。

但这里的一个关键点是这个问题的答案:谁负责特殊的 PDF 功能?或者这个特殊功能与谁真正相关?File还是Layout

于 2014-05-21T07:13:01.183 回答