Самое лучшее объяснение. Смотрел видео где было показано в теории хорошо, но проседало пояснение в коде, либо наоборот только код, а здесь все идеально. Спасибо большое!
Очень благодарен вам за серию уроков по шаблонам, ...читаю книгу Мэт Зандстры"php, objects and patterns" и в основном благодаря вашим урокам и доступным примерам по decorator/composite/abstract factory и т.д. понимаю о чем идет речь в книге. Ещё раз БОЛЬШОЕ ВАМ СПАСИБО :)
Уважаемый Автор! Спасибо за уроки по разбору паттернов. Но есть несколько "но" с точки зрения программиста: 1. Излишние "паблики" в данном случае не нужны (кроме public void print(){//...}). Надо привыкать грамотно ограничивать области видимости "с пеленок". 2. Уж если Вы реализовали метод void print() в абстрактном классе Decorator, то это уже, по сути, не абстрактный класс. Для сохранения структуры паттерна этого не надо было делать. А так очень познавательно. Большой + за то, что сделан упор не на теорию (которой в инете "до жопы"), а на практическую реализацию. Спасибо!
это же пример паттерна, а не "Как грамотно расставить модификаторы доступа") тем более, все его примеры рассчитаны на людей, уже знакомых с JavaCore и ООП
Разве в абстрактном классе реализовывать методы - плохой тон? Если например такая ситуация, что там есть абстрактные методы и есть метод, который во всех наследниках будет одинаков. Его ж в любом случае будет правильно вынести в этот родительский абстрактный класс.
Не понял, в каком месте автор канала реализовал абстрактный метод print()? Чего-то я не вижу реализации. А является он абстрактным: 1) потому что необходимо перебросить абстрактный метод print() дальше по ветке наследования; 2) нет никакого смысла создавать объект, а если и захочется, то нам придется реализовать абстрактный метод print(), который пришел к нам от реализованного интерфейса. Если и реализуем, то получится тот же метод print(), что и в классе Printer. Если реализуем по-другому, то возвращаемся к тому случаю, как и классы LeftBracketDecorator, RightBracketDecorator, QuotesDecorator. Стало быть, вернулись к тому же, отчего хотели уйти (улучшить код).
Спасибо! Все четко! Я еще на том этапе, когда задают глупые вопросы: Зачем было выдумывать паттерн декоратор, когда можно использовать наследование и переопределение? public class My { public static void main(String[] args) { World my = new Decoration(); my.print(); } } class World { void print(){ System.out.println("Привет"); } } class Decoration extends World { @Override void print() { super.print(); System.out.println("МИР!!!"); } } объясните плиз преимущества и недостатки... или может я вообще что-то не вкуриваю?
так ты сам в своем вопросе и ответ можешь найти. Как изменить существующий функционал, не прибегая к наследованию и переопределению и при этом так, чтобы клиент ничего не понял, создаешь класс обертку, который обертывает существующий код новым одеялом. Например, летом ты спишь под пустым пододеяльником, а зимой заправляешь в него теплое одеяло)))
Если тебе надо будет написать не Привет Мир, а Пока Мир, у тебя еще 2 класса появятся. А с декоратором только 1, который Пока. А потом ты его декорируешь уже существуещим, который Мир. При этом декорировать можно снаружи, не меня кода, который ты допустим распространил на 100млн пользователей уже )
Здравствуйте, а разве в абстрактном классе Decorator метод print() не лучше будет обьявить абстрактным? Т.е. для того, что бы быть конкретным декоратором классу необходимо обязательно реализовать этот абстр. метод.
а если без инстанса вызвать метод print, вообще кошмарная конструкция получается. new QuotesDecorator(new LeftBracketDecorator(new RightBracketDecorator(new Printer("Идёт печать")))).print();
Неоднозначное чувство после просмотра урока, как в анекдоте, когда нелюбимая тёща разбивается на новой машине зятя. Вроде, и пример интересный, понятный... Но вот это вот "сам запутался"... Можно было бы перезаписать эту часть, если целью видео является научить, а не затроллить.
Рецепт как запутать код, что бы другие долго чесали репу и недоумевали Чем плохи старые добрые. object.print1; . object.print2; . object.print3; .... ?
нормальное объяснение. при печати JVM проходит через весь стек наших компонентов до самого глубокого, печатает его, и потом в обратном порядке сворачивается, печатая методы высших уровней
привет из 2024, все еще актуально, автору огромный респект, очень доходчиво👍
Все ясно и понятно, спасибо. Единственное, чуть чаям не подавился, на месте "чет я запутался".
аналогично) хоть он и запутался, но т.к. доходчиво объясняет, я уже сам понял порядок выполнения)
Самое лучшее объяснение. Смотрел видео где было показано в теории хорошо, но проседало пояснение в коде, либо наоборот только код, а здесь все идеально. Спасибо большое!
грыжа
Уже на второй минуте понял больше чем по документациям!) То что нужно)
Блоксхемы решают) Спасибо автору!)
Отличный урок. До этого посмотрел много маленьких роликов и прочитал пару статей. А это видео расставило все по своим местам. Класс!
Отличная серия по паттернам. И вообще канал отличный спасибо за Ваш труд. Помогаете в освоении языка очень сильно.
Очень доходчиво объясняете,отличный урок.
Спасибо тебе, добрый человек!
Большое спасибо! Ваше объяснение "зашло" с первых минут!
Привет
великолепно, прочитал паттерн в книге издательства o'reilly - все классно объяснили, но по видео практический момент расставил все точки.
+Dennis Spade спасибо, осталось еще немного сделать для завершения серии, самые сложные остались))
У Владимира самые понятные видео о паттернах на ютубе. Как орешки щелкаются
Очень благодарен вам за серию уроков по шаблонам, ...читаю книгу Мэт Зандстры"php, objects and patterns" и в основном благодаря вашим урокам и доступным примерам по decorator/composite/abstract factory и т.д. понимаю о чем идет речь в книге. Ещё раз БОЛЬШОЕ ВАМ СПАСИБО :)
Агонь, всё ясно и по царски! Спасибо за видео =)
Спасибо за видео. После англоязычных туториалов приятно послушать ещё объяснение на русском)
Спасибо, только ваше видео помогло
Спасибо! это супер доходчивое объяснение! Урра!:)
a really comprehensive explanation, thank u so much!
Я первый раз смотрю видео на эту тему, автор объясняет, я все понимаю, но тут он вдруг говорит "чет я запутался". Забавно :D
Спасибо за урок! Было бы проще объяснить последовательность действий, если учитывать последовательность вызовов методов в каждом декораторе
спасибо за урок!
+Serhii Horun на здоровье!! спасибо за отзыв.
+Школа программирования Можешь код на github выложить?
Хотелось бы отметить, что данный паттерн широко применен в пакете .io* на потоках ввода-вывода. Если я правильно понимаю.
Спасибо. Очень доступно
Очень понравилось! Спасибо)
Шерлок, ты почему ещё на 22-м уровне или уже работаешь программистом?)
@@Judosaper Вы следите за мной?)
@@hamster_04 конечно, уже давно!)
Уважаемый Автор!
Спасибо за уроки по разбору паттернов.
Но есть несколько "но" с точки зрения программиста:
1. Излишние "паблики" в данном случае не нужны (кроме public void print(){//...}). Надо привыкать грамотно ограничивать области видимости "с пеленок".
2. Уж если Вы реализовали метод void print() в абстрактном классе Decorator, то это уже, по сути, не абстрактный класс. Для сохранения структуры паттерна этого не надо было делать.
А так очень познавательно. Большой + за то, что сделан упор не на теорию (которой в инете "до жопы"), а на практическую реализацию.
Спасибо!
это же пример паттерна, а не "Как грамотно расставить модификаторы доступа")
тем более, все его примеры рассчитаны на людей, уже знакомых с JavaCore и ООП
I disagree with 2 path. Abstract class able to contain not abstract methods. And say about 1 path no public, but protected
Разве в абстрактном классе реализовывать методы - плохой тон?
Если например такая ситуация, что там есть абстрактные методы и есть метод, который во всех наследниках будет одинаков. Его ж в любом случае будет правильно вынести в этот родительский абстрактный класс.
Не понял, в каком месте автор канала реализовал абстрактный метод print()? Чего-то я не вижу реализации. А является он абстрактным: 1) потому что необходимо перебросить абстрактный метод print() дальше по ветке наследования; 2) нет никакого смысла создавать объект, а если и захочется, то нам придется реализовать абстрактный метод print(), который пришел к нам от реализованного интерфейса. Если и реализуем, то получится тот же метод print(), что и в классе Printer. Если реализуем по-другому, то возвращаемся к тому случаю, как и классы LeftBracketDecorator, RightBracketDecorator, QuotesDecorator. Стало быть, вернулись к тому же, отчего хотели уйти (улучшить код).
Если хочешь сам что-то понять попробуй объяснить другому)) Спасибо за видео)))
Огромное спасибо!
Прекрасное видео
Спасибо! Все четко!
Я еще на том этапе, когда задают глупые вопросы:
Зачем было выдумывать паттерн декоратор, когда можно использовать наследование и переопределение?
public class My
{
public static void main(String[] args) {
World my = new Decoration();
my.print();
}
}
class World {
void print(){
System.out.println("Привет");
}
}
class Decoration extends World {
@Override
void print()
{
super.print();
System.out.println("МИР!!!");
}
}
объясните плиз преимущества и недостатки... или может я вообще что-то не вкуриваю?
так ты сам в своем вопросе и ответ можешь найти. Как изменить существующий функционал, не прибегая к наследованию и переопределению и при этом так, чтобы клиент ничего не понял, создаешь класс обертку, который обертывает существующий код новым одеялом. Например, летом ты спишь под пустым пододеяльником, а зимой заправляешь в него теплое одеяло)))
Если тебе надо будет написать не Привет Мир, а Пока Мир, у тебя еще 2 класса появятся. А с декоратором только 1, который Пока. А потом ты его декорируешь уже существуещим, который Мир. При этом декорировать можно снаружи, не меня кода, который ты допустим распространил на 100млн пользователей уже )
Скажите, а что за книжка промелькнула на 18:09 (ua-cam.com/video/X7-3wQElWd4/v-deo.html)? "применение шаблонов java", а что за автор?
Держи:
cloud.mail.ru/public/CQ2C/8z1YKEbJ5
@@programm4you спасибо!
@@programm4you уже нет книги:-(
@@ViktorVdovichenko все там есть
хахха. настроение поднял)
Может кому пригодиться:
github.com/ta4anka/DesignPatterns/blob/master/src/basepatterns/structural/decorator/DecoratorApp.java
Здравствуйте, а разве в абстрактном классе Decorator метод print() не лучше будет обьявить абстрактным? Т.е. для того, что бы быть конкретным декоратором классу необходимо обязательно реализовать этот абстр. метод.
абстрактные методы не выполняют никаких действий = методам в интерфейсах
Спасибо.
а если без инстанса вызвать метод print, вообще кошмарная конструкция получается. new QuotesDecorator(new LeftBracketDecorator(new RightBracketDecorator(new Printer("Идёт печать")))).print();
Больше всего смущает вкладка "Грыжа"! Неужели нас всех это ждет((((
Меня очень смущает, что у всех декораторов одинаковый конструктор :-)
Надеюсь спустя два года тебя это перестало смущать)
16:25 просто угар)
Спасибо!
Неоднозначное чувство после просмотра урока, как в анекдоте, когда нелюбимая тёща разбивается на новой машине зятя.
Вроде, и пример интересный, понятный... Но вот это вот "сам запутался"... Можно было бы перезаписать эту часть, если целью видео является научить, а не затроллить.
Автор похоже сам запутался пока объяснял
thx
Учитель с вас так себе)
А зачем нужен интерфейс, все это так же делается и без него?!
интерфейс не нужен, нужно исходить из того что у вас есть задача дописать класс, который использует интерфейс, и ничего с этим поделать нельзя
абстрактный метод принт забыл написать =(
не до конца видос посмотрели
Рецепт как запутать код, что бы другие долго чесали репу и недоумевали
Чем плохи старые добрые. object.print1; . object.print2; . object.print3; .... ?
Заебис
Блин, объяснение неправильное.Ты сам запутался и меня запутал.
нормальное объяснение.
при печати JVM проходит через весь стек наших компонентов до самого глубокого, печатает его, и потом в обратном порядке сворачивается, печатая методы высших уровней
более худшего обяснения декоратора я не видел