2

开放 - 封闭原则的Wikipedia page(截至今天2013-02-27)表示它通过继承来实现。立面是否利用开放原则?

名称打开/关闭原则已被用于两种方式。这两种方式都使用继承来解决明显的困境,但目标,技术和结果是不同的。

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

无论如何,我的问题是关于Façade模式,其中不是使用继承。由于它定义了一个抽象形式的简化接口到一个更复杂的子系统(或库),这不能被视为开放闭合原则吗?更具体地:

副系统(或文库)是对扩展开放到使用外墙,其接口是关闭变形例的客户端。

或者我只是伸展信息隐藏的边界(这是非常接近OCP,尤其是如果你认为它为Protected Variations)。

回答

1

不,门面模式解决了与OCP不同的问题。 Facade只是一个面向其他类的类。 Facade使它的客户免于它所面临的类别的变化,但这不是OCP。 OCP是关于单个类如何响应需求变化而改变的。建立Facade的任何内容都不是为了引导这些变化。如果客户对立面的要求发生变化,立面也会发生变化。如果任何Facade面向Facade关心的方向发生变化,那么Facade也会如此。

可以设想一个设置为遵循OCP的Facade版本 - 也许是一个Facade,它的客户端接口是一个接口或抽象类,它被修改但是可以扩展以适应新的需求 - 并且可以事实上,我一直以这种方式实现Facades,但这不是Facade的经典描述的一部分。

+0

我不明白,“如果客户对Facade的要求发生变化,Facade就会变更。战略也会因此而中断。 “如果任何Facade面向Facade关心的方向发生变化,那么Facade也会如此。” - 但是Facade的隐藏部分发生了变化。 [OCP ==类中的私有成员变量](https://www.cs.duke.edu/courses/fall07/cps108/papers/ocp.pdf#page=9)。 – Fuhrmanator 2016-02-14 20:14:43

+0

我将Facade看作是一个不稳定(私人)子系统的稳定接口。至于必须有一个接口或抽象类,我不确定。 [JOptionPane](https://docs.oracle.com/javase/7/docs/api/javax/swing/JOptionPane.html)是我最喜欢Facade的例子。它不是一个抽象类/接口。它的公共部分不会很快改变(除了可能添加方法)。 – Fuhrmanator 2016-02-14 20:18:03

+0

我想到了这一点,并没有拿出任何话来解释我的立场,我还没有说过。如果我想到某件事,我会回来的。 – 2016-02-17 05:56:36