【问题标题】:Facade pattern vs. SRP立面图案与 SRP
【发布时间】:2023-03-04 16:54:02
【问题描述】:

在经典的 Facade 模式中,单个对象通常为更复杂的事物提供简化的接口。

正如四人组所说(尽可能接近“官方”......):

Facade (185) 为子系统中的一组接口提供统一的接口。 Facade 定义了一个更高级别的接口,使子系统更易于使用。

和

...外观只是将接口抽象为子系统对象,以使它们更易于使用;它没有定义任何新功能,子系统类也不知道它。

或者,正如 Unmesh 在 https://stackoverflow.com/a/5242476 中所说的那样:

Facade 使用户免受系统复杂细节的影响,并为他们提供易于使用的简化视图。它还将使用系统的代码与子系统的细节解耦,便于以后修改系统。

单一职责原则告诉我们

一个类或模块应该有一个,而且只有一个,改变的理由。

鲍勃叔叔 (http://en.m.wikipedia.org/wiki/Single_responsibility_principle)

鉴于 Facade 在设计上可以保护用户免受众多“改变理由”的影响,这两种想法如何协同工作? Facade 的更改理由不是与其实现所依赖的子系统的数量一样多吗?

【问题讨论】:

  • 改变外观的众多原因是什么?
  • 将在帖子中澄清

标签: oop design-patterns solid-principles single-responsibility-principle facade


【解决方案1】:

基本上,如果你的 Facade 类实现了依赖倒置原则(它依赖于抽象,而不依赖于具体实现),你将不需要修改以后会的。

异常 - 如果存在错误或您需要更改 Facade 的业务逻辑(例如,它封装的那些子系统之间的交互)。但这不是 SRP 违规。

顺便说一句,似乎引用中隐含地提到了它:

Facade (185) 为子系统中的一组接口提供统一的接口

【讨论】:

  • 是的,除了门面的部分任务是保护消费者免受底层系统变化的影响之外,这是有道理的。如果这样做是值得的,这是否意味着这些系统足够复杂,以至于它们的接口都会随着版本的变化而改变?
  • 我明白你的意思。是的,如果您必须更新特定子系统的接口 - 这意味着您违反了该接口的接口隔离原则。并且不要忘记开闭原则——扩展现有接口/类比更新它的内部内容要好。似乎您在构建新类时必须了解所有 SOLID 原则:)
【解决方案2】:

首先,

模式和原则 - 是两个不同的东西。模式是经过验证的问题解决方案,而原则只不过是指导方针。

因此,比较它们是没有意义的,尤其是因为它们在大多数情况下是相互补充的。

至于 SRP 的定义,“一个改变的理由”很容易解释:

如果您构建汽车对象的图像,它将由引擎、类型和类似的东西组成。因此,该对象的构造如下所示:

car = new Car(new Engine(), new Type());

如果你想更换那辆车的发动机怎么办?然后你只需替换Engine 的实例。这是改变的原因之一,因为您不会触及它的其他部分。

至于外观,您提供的定义过于笼统。外观只是包装在某些环境下可能不可用的东西的另一种方式。他们只是确保您的东西可以在所有环境中工作。例如,在 JavaScript 中有一个非常著名的事件监听器示例:

function click(object, handler){
   if (object.addEventListener != undefined){
     // For major browsers
     object.addEventListener(....);
   } else if (object.attachEvent != undefined){
     // For IE < 7
     object.attachEvent(...)
   } else {
     object.click = handler;
   }
}

【讨论】:

  • 更新我的问题以反映门面的“官方”GoF 定义
  • 您的示例外观并不真正符合外观模式的经典定义,至少在 OO 圈子中。
  • 我描述的定义来自Ross Harmes和Dustin Diaz的书,称为JavaScript设计模式(第141页)。至于你反映的变化,我只是为那些“门面”实现一个接口,因为现在实现将依赖于抽象而不是具体实现,这将解决你的问题
  • 是的,他们已经为 javascript 世界调整了模式。我认为他们的模式被很好地标记为“门面”,因为它包含了对多个潜在底层子系统的访问。然而,它与经典的 Facade 模式完全不同,在经典 Facade 模式中,Facade 对象将包含多个方法,例如这个。应该注意的是,即使在它们很小的“门面”中,也至少有三个潜在的改变原因,因为支持三种不同的标准。
猜你喜欢
  • 2011-02-15
  • 2010-12-19
  • 1970-01-01
  • 2013-03-25
  • 2011-09-15
  • 2017-03-14
  • 2010-10-03
  • 1970-01-01
相关资源
最近更新 更多