2

Wikipedia page (на сегодняшний день 2013-02-27) для открытого принципа гласит, что он реализуется через наследование.Использует ли Façade принцип Open-Closed?

Название Открытый/Закрытый принцип использовался двумя способами. Оба способа используют наследование для разрешения кажущейся дилеммы, но цели, методы и результаты различны.

«Два пути» относится к наследованию реализации Мейера и более распространенным полиморфным расширениям.

Во всяком случае, мой вопрос касается картины Façade, которая делает не использование наследования. Поскольку он определяет абстракцию в виде упрощенного интерфейса к более сложной подсистеме (или библиотеке), разве это нельзя рассматривать также как принцип открытого закрытия? Более конкретно:

Подсистема (или библиотека) является открыт для расширения к клиенту, который использует фасад, чей интерфейс закрыт для модификации.

Или я просто растягиваю границы скрытия информации (что очень близко к OCP, особенно если вы считаете это Protected Variations).

ответ

1

Нет, шаблон фасада обращается к другой проблеме, чем к OCP. Фасад - это просто класс, который подходит для некоторых других классов. Фасад изолирует своих клиентов от изменений в классах, для которых он работает, но это не OCP. OCP - это то, как отдельные классы меняются в ответ на изменения требований. Ничто для фасада не настроено для изменения этих изменений. Если требования клиента на Фасад меняются, то и Фасад. Если какой-либо из классов, с которыми сталкивается Facade, изменится так, как это делает Facade, так будет и Facade.

Можно представить версию Фасада, которая настроена на выполнение OCP - возможно, Фасад, интерфейс которого к клиенту является интерфейсом или абстрактным классом, который закрыт для модификации, но может быть расширен для размещения новых требований - и в факт, что я всегда реализовывал Фасады, но это не часть классического описания Фасада.

+0

Я не понимаю, 'Если требования клиента к изменению фасада, так же как и Фасад. 'Клиент * закрыт для модификации *; Стратегия тоже сломается. 'Если какой-либо из классов, что Фасад фасадов для изменения в пути, что Фасад заботится, так будет и Фасад.', но скрытая часть Фасад меняется. [OCP == переменные-члены private в классе] (https://www.cs.duke.edu/courses/fall07/cps108/papers/ocp.pdf#page=9). – Fuhrmanator

+0

Я вижу Фасад как устойчивый интерфейс к нестабильной (частной) подсистеме. Что касается наличия интерфейса или абстрактного класса, я не уверен. [JOptionPane] (https://docs.oracle.com/javase/7/docs/api/javax/swing/JOptionPane.html) - мой любимый пример фасад. Это не абстрактный класс/интерфейс. Его публичная часть не изменится в ближайшее время (за исключением, возможно, добавления методов). – Fuhrmanator

+0

Я подумал об этом немного и не придумал никаких слов, чтобы объяснить свою позицию, о которой я еще не сказал. Я вернусь, если что-нибудь придумаю. –