Façade 是不是利用了开闭原则?

Posted

技术标签:

【中文标题】Façade 是不是利用了开闭原则?【英文标题】:Does Façade leverage the Open-Closed Principle?Façade 是否利用了开闭原则? 【发布时间】:2013-02-27 20:33:18 【问题描述】:

开闭原则的Wikipedia page(截至今天2013-02-27)说它是通过继承实现的。

开放/封闭原则这个名称有两种使用方式。两种方式都使用继承来解决明显的困境,但目标、技术和结果不同。

“两种方式”是指 Meyer 的实现继承和更常见的多态扩展。

无论如何,我的问题是关于Façade 模式,它 使用继承。既然它以简化接口的形式定义了一个对更复杂的子系统(或库)的抽象,难道这也不能被看作是开闭原则吗?更具体地说:

子系统(或库)对扩展开放到使用 Façade 的客户端,其接口对修改关闭

或者我只是在扩展信息隐藏的界限(这非常接近 OCP,尤其是如果您将其视为 Protected Variations)。

【问题讨论】:

【参考方案1】:

不,Facade 模式解决的问题与 OCP 不同。 Facade 只是一个类,它是其他一些类的前面。 Facade 将它的客户与它所面对的类的变化隔离开来,但这不是 OCP。 OCP 是关于各个类如何响应需求变化而变化的。没有任何关于 Facade 的设置来引导这些更改。如果客户对立面的要求发生变化,立面也会发生变化。如果 Facade 面向的任何类以 Facade 关心的方式发生变化,Facade 也会如此。

人们可以想象一个按照 OCP 设置的 Facade 版本——也许是一个 Facade,其与客户端的接口是一个接口或抽象类,它对修改是封闭的,但可以扩展以适应新的需求——事实上我一直以这种方式实现 Facade,但这不是 Facade 的经典描述的一部分。

【讨论】:

不明白,If client's requirements on Facade change, so will the Facade.客户端禁止修改;战略也会因此而崩溃。 If any of the classes that the Facade fronts for change in ways that the Facade cares about, so will the Facade. -- 但是外观的隐藏部分发生了变化。 OCP == member variables private in a class. 我将 Facade 视为不稳定(类似私有)子系统的稳定接口。至于必须有一个接口或抽象类,我不确定。 JOptionPane 是我最喜欢的 Facade 示例。它不是抽象类/接口。它的公共部分不会很快改变(除了可能添加方法)。 我想了一会儿,还没有想出任何话来解释我还没有说过的立场。如果我有什么想法,我会回来的。

以上是关于Façade 是不是利用了开闭原则?的主要内容,如果未能解决你的问题,请参考以下文章

设计模式

利用开闭原则 (SOLID)

开闭原则

6大设计原则之开闭原则

开闭原则

设计模式 开闭原则