Композиция vs узор фасада

Я нашел ответ, который заставил меня немного больше понять композицию классов.

class Engine
{

}

class Automobile
{

}


class Car extends Automobile // car "is a" automobile //inheritance here
{ 
 Engine engine; // car "has a" engine //composition here

}

но разве это не фасадный узор? Разве фасад не предназначен для упрощения класса путем разделения на подклассы? В чем же тогда разница между композицией и фасадом?

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

Повышение качества Laravel с помощью принципов SOLID: Лучшие практики и примеры
Повышение качества Laravel с помощью принципов SOLID: Лучшие практики и примеры
Когда мы говорим о том, как сделать следующий шаг в качестве разработчика, мы должны понимать, что качество кода всегда является основным фокусом на...
Принципы SOLID - лучшие практики
Принципы SOLID - лучшие практики
SOLID - это аббревиатура, обозначающая пять ключевых принципов проектирования: принцип единой ответственности, принцип "открыто-закрыто", принцип...
3
0
1 289
2

Ответы 2

Композиция объединяет N других объектов в объект с тем же API. Таким образом, вы можете вызывать один и тот же метод как для составного объекта, так и для его компонентов.

Кажется, что Фасад делает что-то очень похожее, но я думаю, что он снимает ограничение, когда составной объект должен соответствовать одному и тому же API. Вся суть фасада в том, что API-интерфейсы оболочки и оболочки могут быть разными.

Пример, который вы показываете, не является ни формальным Composite, ни Facade, но если вы возьмете самое открытое определение Composite, то это может быть одно: «объект, который имеет другие объекты в качестве членов, с которыми он выполняет операции».

Я в порядке с тобой

AndroidLover 24.12.2019 19:22

Шаблон фасада - это шаблон проектирования, используемый для изменения интерфейса, не подходящего для ваших текущих потребностей, на более полезный. Он полностью инкапсулирует другой интерфейс, не раскрывая его.

Некоторые примеры использования:

  • File.Copy () не может быть легко смоделирован в .NET, поэтому я пишу фасад, который делегирует ему виртуальный метод, так что я могу издеваться над этим фасадом.
  • При использовании сторонней библиотеки вы можете не разрешать связывание типов в этой библиотеке, поэтому вы пишете фасад для инкапсуляции этих типов и предоставляете только свои копии.
  • Класс, который вы хотите использовать, может иметь огромное количество методов, но вам нужно всего несколько. Поверх этих немногих можно написать фасад, чтобы упростить интерфейс.
  • Класс обслуживания может иметь загадочное использование («передайте -19438 в качестве второго аргумента, если вы хотите включить сглаживание»), для которого вам не нужно иметь все параметры в вашем коде. Создайте более простой в использовании фасад над этим классом, чтобы повысить читаемость вашего основного кода.

Другие вопросы по теме