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

相關問題