在OOD

时间:2018-02-19 17:58:47

标签: oop design-patterns object-oriented-analysis

我对Facade设计模式有疑问。当我开始从书中学习设计模式:可重用的面向对象软件的元素时,可以很好地解释它是什么以及它如何解决问题。

这张图片来自那本书:

enter image description here

问题:     假设我在DomainFacade/interface的子系统中添加了一些额外的功能。有了这个设计,我认为在不改变Domain类的情况下,不可能在子系统中添加额外的功能吗?

其次,假设我使用抽象类Domain(创建层次结构)并将所有请求委托给它的子类,这样每当我想添加新功能时,我只是扩展我的新使用Domain(abstract)的类/子系统,会出错还是我会有Facade结构?

同样的事情发生在Adapter模式中。我们可以使用不同类型的适配器,而不是硬编码一个类,我们可以创建这样的层次结构而不违反任何OOD规则吗?

2 个答案:

答案 0 :(得分:1)

外观以及适配器设计模式是所谓的"包装器的一部分"模式(以及装饰和代理)。它们基本上包装某些功能并提供不同的界面。他们的不同之处在于他们的意图:

  • facade:用于为客户提供简单的界面,隐藏其背后提供的操作的复杂性

  • 适配器:允许两个不兼容的接口协同工作而不改变其内部结构

  • 装饰器:允许静态或动态地将新功能添加到对象,而不会影响同一类对象的行为

  • proxy:一个类(代理)用于表示和允许访问 另一个类的功能

如果你的组件"在后面"添加新功能,并且您希望外观显示此功能,您必须调整外观才能执行此操作。

如果您将Domain类(在您的场景中为facade)作为其他人扩展的抽象类,那么您没有Facade,您拥有使用类创建的任何继承。简单地说,没有"包装"实现立面图案的意图。

答案 1 :(得分:0)

  

通过这种设计,我认为在不更改Domain类的情况下在子系统中添加额外功能是不可能的?

真。但是,您所做的更改可能(或可能不会)影响客户端(Process)类。如果向Façade添加 new 方法,则不会破坏“旧”客户端。虽然它不是它的明确意图(隐藏子系统的复杂性),但Façade可以为其客户端提供可扩展的稳定接口。当我说 interface 时,我不是指Java或C#接口。这是一个编程接口。

一个真实的例子是Java / Swing中的JOptionPaneFaçade。检查我放置的链接上的Java文档,你会看到它的一些方法存在于1.4中,一些存在于1.6中,等等。基本上,由于这个类是Swing库的一部分,它必须保持稳定,所以老客户端它的界面不会破坏。但是,通过简单地添加新方法,它仍然具有扩展和新功能。

我想说这就是Façades通常如何扩展,而不是子类或层次结构。层次结构难以维护,因为它们很脆弱。如果您得到抽象错误(层次结构的根),那么当您需要更改它时,它会影响整个树。当层次结构中的抽象稳定(确定)时,层次结构是有意义的。

适配器模式具有层次结构,因为适配器会调整方法以使用无法更改的服务的多个变体。您可以在https://stackoverflow.com/a/13323703/1168342查看几个稳定(抽象)服务的示例,例如税务计算,会计服务,信用授权等。