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

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

class Engine
{

}

class Automobile
{

}


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

}

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

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


person elzoy    schedule 01.07.2018    source источник


Ответы (2)


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

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

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

person Alper    schedule 02.07.2018
comment
я в порядке с тобой - person AndroidLover; 24.12.2019

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

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

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