На двух наследниках и двух имплементациях разница не ощутима, но, допустим, понадобилось добавить PHP dev и какую-нить CMS и тогда придется создавать 9 классов, вместо 6. Будет (BankSystem, PHP), (BankSystem, Java), (BankSystem, C++), (StockExchange, PHP), (StockExchange, Java), (StockExchange, C++), (CMS, PHP), (CMS, Java), (CMS, C++). А используя паттерн "мост", нам нужно будет добавить всего 2 реализации. Имплементировать интерфейс Developer и расширить класс Programm. А если мы еще захотим добавить один язык и еще одну программу, то разница будет еще более ощутимая.
Блин. Шикарно, что кратное видео, но! Вы уж очень много путаете, трудно смотреть. Ну и стиль кода.. Диаграммы - хорошо. А суть шаблона не раскрыта, не рассказана.
Здравствуйте. Лично для меня Вы очень четко выбираете примеры.Не самолеты и автомобили... Спасибо за ваш труд. Очень хочу понять когда и какой использовать. И ... нужно ли их воспроизводить по памяти
Здраствуйте, Андрей. Спасибо за отзыв. Здесь и помогают примеры + понимание основ паттерна. Когда встретитесь с задачей, которая похожа на пример - используйте паттерн. Крайне рекомендую придумать свои примеры - так лучше отложится в памяти. Здесь, также, крайне помогает опыт.
А в чем, собственно, отделение абстракции от реализации? Интерфейс разработчика абстрагирует разработчика, разработчик конкретная реализация. Интерфейс разработки абстракция программы, программа учета - конкретная реализация. Получается, две абстракции с реализациями через наследование. Причем мост устанавливает сильную связанность между этими методами (попробуйте что-нибудь без void). Я не понимаю, абстракция чего отделяется от реализации чего? Или надо композировать разработчика и разработку, рассматривая абстракцию написания программы от конкретной реализации? (но тогда сохраняется сильная связанность разработчика и процесса разработки).
Согласен. Автору конечно большой респект за доходчивое объяснение примеров, но сама суть паттернов передается скудновато. К концу каждого урока остается ощущение, что ты понял практический пример, а для чего все это делалось уже подзабыл. Пришел к решению загонять код и текстовое описание урока в нейронку и получаю что-то хоть сколько то похожее на объяснение сути, а не простое проговаривание классов и переменных из примера. Далее ответ нейросети по запросу "Где здесь реализуется "Мост"?" : В данном примере "Мост" реализуется следующим образом: Абстракция (Program): Это абстрактный класс, представляющий высокоуровневую логику программы. Он содержит ссылку на объект типа Developer. Реализация (Developer): Это интерфейс, представляющий низкоуровневую логику разработчика. Конкретные классы Абстракции (BankSystem, StockExchange): Это конкретные классы, расширяющие абстрактный класс Program и реализующие его метод developProgram(). Каждый из этих классов принимает объект Developer в конструкторе и использует его для разработки программы. Конкретные классы Реализации (JavaDeveloper, CppDeveloper): Это классы, реализующие интерфейс Developer. У каждого из этих классов есть своя реализация метода writeCode(). Теперь давайте посмотрим, где проявляется "Мост": Сам "Мост" проявляется в том, что Program содержит ссылку на объект Developer, но они не жестко связаны между собой. То есть, Program предоставляет абстракцию высокого уровня (разработка программы), но реализацию этой абстракции (написание кода) она делегирует объекту Developer. При использовании "Моста", изменения в Program и Developer могут происходить независимо друг от друга. Например, можно добавить новые типы программ или новых разработчиков, не затрагивая существующий код. Таким образом, "Мост" в данном примере проявляется в отделении абстракции от её реализации и предоставлении гибкости для изменений в каждой из сторон.
Понимаю что причины могут быть разные для появления шаблонов, но верно ли что реализация Bridge и Adapter одинаковая? И там и там экстендится класс в который передается ссылка на экземпляр класса с определенным интерфейсом, что позволяет оперировать методами последнего. Реализация одинаковая у Bridge и Adapter?
Если я не ошибаюсь, то получается так: Есть Program, у которой есть поведение - developProgram(). Это поведение делегируется разработчику(Developer). Разработчиков можно менять, у разных разработчиков может быть разное поведение. Получается, что Program может менять поведение в runtime. Кажется мне, что где-то я видел уже такое, интересно где? В паттерне "Стратегия" я это видел. Если я прав и это не "Мост", а "Стратегия", то что это за дезинформация? Или это гибрид стратегии и моста? Я без негатива, если что. Меня бесит паттерн "Мост", каждый по-своему его объясняет.
en.m.wikipedia.org/wiki/Bridge_pattern Думаю, здесь наиболее корректное объяснение- старался следовать этому подходу, если видите неточность - напишите, пожалуйста- я изучу более детально. Спасибо.
И утверждение, что программа делегирует разработчику выполнение метода - не корректно, как мне кажется. И стоит помнить к каким группам относятся стратегия и мост и какие задачи выполняют.
Разные паттерны могут иметь ту же реализацию. Паттерн больше идентифицирует его назначение. Стратегия - позволяет переключаться между схожими поведениями. Мост - позволяет расширять программу в "двух плоскостях" - высокоуровневой плоскости и плоскости реализации. Некоторые отличающиеся детали: - в случае со стратегией, мы переключаемся между поведениями (например точный и долгий расчет маршрута, или неточный и быстрый). в то время как в мосте мы переключаемся между реализациями (например cpp/java developer, win gui / linux gui, plain text writer / html writer) - стратегия требует только одной иерархии (самих Strategy), в то время как мост вероятнее всего будет иметь две параллельные иерархии (как Developer и Program из примера)
Для новичка сложно будет понять в чем здесь суть. Надо объяснить что разделяя два элемента которые работают вместе и работая с ихними абстракциями, мы создаем возможность изменять и создавать их отдельно друг от друга. Это и есть мост. Может так?
Для быстрого создания итератора можно применять ключевое слово «iter» и идея сама создаст каркас итератора по примеру fori для фор. Возможно на момент записи видео такого ключевого слова в идее не было.
Уважаемый Евгений! А вот такая конструкция создания объектов как называется? И где и в какой книге (сайте) она была описана? Program [] programs = { new BankSystem(new CppDeveloper()), new StockExchange(new JavaDeveloper()) };
Уважавемый, Andy! Вряд ли это можно назвать конструкцией создания объектов :) В production такое не применяется, а здесь используется для демонстрации работы учебного приложения.
все очень понятно, но для новичков было бы круто показать противоположный пример, когда все жёстко привязанно и чем это плохо
На двух наследниках и двух имплементациях разница не ощутима, но, допустим, понадобилось добавить PHP dev и какую-нить CMS и тогда придется создавать 9 классов, вместо 6. Будет (BankSystem, PHP), (BankSystem, Java), (BankSystem, C++), (StockExchange, PHP), (StockExchange, Java), (StockExchange, C++), (CMS, PHP), (CMS, Java), (CMS, C++). А используя паттерн "мост", нам нужно будет добавить всего 2 реализации. Имплементировать интерфейс Developer и расширить класс Programm. А если мы еще захотим добавить один язык и еще одну программу, то разница будет еще более ощутимая.
Много что смотрел, но вот эти видео лично для меня наиболее полезны, понятны, емкие и локаничные. Отдельный респект за отсутствие лишней воды!
и где тут мост?
Блин. Шикарно, что кратное видео, но! Вы уж очень много путаете, трудно смотреть. Ну и стиль кода.. Диаграммы - хорошо. А суть шаблона не раскрыта, не рассказана.
Здравствуйте. Лично для меня Вы очень четко выбираете примеры.Не самолеты и автомобили... Спасибо за ваш труд. Очень хочу понять когда и какой использовать. И ... нужно ли их воспроизводить по памяти
Здраствуйте, Андрей.
Спасибо за отзыв.
Здесь и помогают примеры + понимание основ паттерна.
Когда встретитесь с задачей, которая похожа на пример - используйте паттерн.
Крайне рекомендую придумать свои примеры - так лучше отложится в памяти.
Здесь, также, крайне помогает опыт.
Спасибо
Наследование - это очень мощная штучка 😂
Как же хорошо ты объясняешь, просто лучший!
Спасибо за отзыв!
Супер! Все просто и понятным языком
А в чем, собственно, отделение абстракции от реализации? Интерфейс разработчика абстрагирует разработчика, разработчик конкретная реализация. Интерфейс разработки абстракция программы, программа учета - конкретная реализация. Получается, две абстракции с реализациями через наследование. Причем мост устанавливает сильную связанность между этими методами (попробуйте что-нибудь без void). Я не понимаю, абстракция чего отделяется от реализации чего? Или надо композировать разработчика и разработку, рассматривая абстракцию написания программы от конкретной реализации? (но тогда сохраняется сильная связанность разработчика и процесса разработки).
Красивое видео!!! Побольше бы таких!
Спасибо!
Не понятна суть. Где, собственно, сам мост?
Согласен. Автору конечно большой респект за доходчивое объяснение примеров, но сама суть паттернов передается скудновато. К концу каждого урока остается ощущение, что ты понял практический пример, а для чего все это делалось уже подзабыл.
Пришел к решению загонять код и текстовое описание урока в нейронку и получаю что-то хоть сколько то похожее на объяснение сути, а не простое проговаривание классов и переменных из примера. Далее ответ нейросети по запросу "Где здесь реализуется "Мост"?" :
В данном примере "Мост" реализуется следующим образом:
Абстракция (Program): Это абстрактный класс, представляющий высокоуровневую логику программы. Он содержит ссылку на объект типа Developer.
Реализация (Developer): Это интерфейс, представляющий низкоуровневую логику разработчика.
Конкретные классы Абстракции (BankSystem, StockExchange): Это конкретные классы, расширяющие абстрактный класс Program и реализующие его метод developProgram(). Каждый из этих классов принимает объект Developer в конструкторе и использует его для разработки программы.
Конкретные классы Реализации (JavaDeveloper, CppDeveloper): Это классы, реализующие интерфейс Developer. У каждого из этих классов есть своя реализация метода writeCode().
Теперь давайте посмотрим, где проявляется "Мост":
Сам "Мост" проявляется в том, что Program содержит ссылку на объект Developer, но они не жестко связаны между собой. То есть, Program предоставляет абстракцию высокого уровня (разработка программы), но реализацию этой абстракции (написание кода) она делегирует объекту Developer.
При использовании "Моста", изменения в Program и Developer могут происходить независимо друг от друга. Например, можно добавить новые типы программ или новых разработчиков, не затрагивая существующий код.
Таким образом, "Мост" в данном примере проявляется в отделении абстракции от её реализации и предоставлении гибкости для изменений в каждой из сторон.
Большое спасибо
Спасибо за отзыв :)
Понимаю что причины могут быть разные для появления шаблонов, но верно ли что реализация Bridge и Adapter одинаковая? И там и там экстендится класс в который передается ссылка на экземпляр класса с определенным интерфейсом, что позволяет оперировать методами последнего. Реализация одинаковая у Bridge и Adapter?
Чем данный паттерн из ролика отличается от декоратора?
Если я не ошибаюсь, то получается так:
Есть Program, у которой есть поведение - developProgram().
Это поведение делегируется разработчику(Developer).
Разработчиков можно менять, у разных разработчиков может быть разное поведение. Получается, что Program может менять поведение в runtime.
Кажется мне, что где-то я видел уже такое, интересно где?
В паттерне "Стратегия" я это видел.
Если я прав и это не "Мост", а "Стратегия", то что это за дезинформация? Или это гибрид стратегии и моста?
Я без негатива, если что. Меня бесит паттерн "Мост", каждый по-своему его объясняет.
en.m.wikipedia.org/wiki/Bridge_pattern
Думаю, здесь наиболее корректное объяснение- старался следовать этому подходу, если видите неточность - напишите, пожалуйста- я изучу более детально. Спасибо.
И утверждение, что программа делегирует разработчику выполнение метода - не корректно, как мне кажется. И стоит помнить к каким группам относятся стратегия и мост и какие задачи выполняют.
Здравствуйте. Можете прочитать мой комментарий под видео выше и сказать своё мнение пожалуйста? Я разобраться не могу
Разные паттерны могут иметь ту же реализацию. Паттерн больше идентифицирует его назначение.
Стратегия - позволяет переключаться между схожими поведениями.
Мост - позволяет расширять программу в "двух плоскостях" - высокоуровневой плоскости и плоскости реализации.
Некоторые отличающиеся детали:
- в случае со стратегией, мы переключаемся между поведениями (например точный и долгий расчет маршрута, или неточный и быстрый). в то время как в мосте мы переключаемся между реализациями (например cpp/java developer, win gui / linux gui, plain text writer / html writer)
- стратегия требует только одной иерархии (самих Strategy), в то время как мост вероятнее всего будет иметь две параллельные иерархии (как Developer и Program из примера)
Для новичка сложно будет понять в чем здесь суть. Надо объяснить что разделяя два элемента которые работают вместе и работая с ихними абстракциями, мы создаем возможность изменять и создавать их отдельно друг от друга. Это и есть мост. Может так?
Очень напоминает паттерн Декоратор...
Спасибо за урок! Подскажи, пожалуйста, название плагина, который UML рисует.
Всегда пожалуйста.
Плагин называется UML Support - он стандартный для Ultimate Edition.
Если у тебя Community, то придётся использовать другой плагин.
Eugene Suleimanov Спасибо
Для быстрого создания итератора можно применять ключевое слово «iter» и идея сама создаст каркас итератора по примеру fori для фор. Возможно на момент записи видео такого ключевого слова в идее не было.
Для справки - в идее вы можете создавать сами какие хотите алиасы
Уважаемый Евгений!
А вот такая конструкция создания объектов как называется?
И где и в какой книге (сайте) она была описана?
Program [] programs = {
new BankSystem(new CppDeveloper()),
new StockExchange(new JavaDeveloper())
};
Уважавемый, Andy!
Вряд ли это можно назвать конструкцией создания объектов :)
В production такое не применяется, а здесь используется для демонстрации работы учебного приложения.
Это просто массив объектов типа Program
Очень быстро.
Обычная подстановка барбары письков. Хз зачем нужен мост, и чем он координально отличается от адаптера.
От адаптера-то понятно чем отличается