Я читав статтю з програмування, і в ній згадувався шаблон декоратора. Я певний час програмував, але без будь-якої формальної освіти чи навчання, але намагаюся дізнатися про стандартні зразки та таке.
Тож я подивився на «Оформлювач» і знайшов у ньому статтю у Вікіпедії . Зараз я розумію концепцію візерунка «Декоратор», але мене цей зрив трохи збентежив:
Як приклад розглянемо вікно у віконній системі. Щоб дозволити прокручування вмісту вікна, ми, можливо, бажаємо додати до нього горизонтальні чи вертикальні смуги прокрутки. Припустимо, вікна представлені екземплярами класу Window, і припустимо, що цей клас не має функціональних можливостей для додавання смуг прокрутки. Ми можемо створити підклас ScrollingWindow, який їх надає, або ми можемо створити ScrollingWindowDecorator, який додає цю функціональність до існуючих об'єктів Window. На даний момент будь-яке рішення було б добре.
Тепер припустимо, що ми також бажаємо можливості додавати межі до наших вікон. Знову ж таки, наш оригінальний клас Window не підтримує. Підклас ScrollingWindow тепер створює проблему, оскільки він фактично створив новий вид вікна. Якщо ми хочемо додати підтримку кордону до всіх вікон, ми повинні створити підкласи WindowWithBorder і ScrollingWindowWithBorder. Очевидно, що ця проблема загострюється з кожною новою функцією, яку потрібно додати. Для рішення декоратора ми просто створюємо новий BorderedWindowDecorator - під час виконання ми можемо прикрасити існуючі вікна за допомогою ScrollingWindowDecorator або BorderedWindowDecorator або обох, як вважаємо за потрібне.
Добре, коли вони кажуть додати межі до всіх вікон, чому б просто не додати функціональність до оригінального класу Window, щоб дозволити можливість? Як я це бачу, підкласифікація - це лише додавання певної функціональності до класу або переосмислення методу класу. Якщо мені потрібно було додати функціонал до всіх існуючих об'єктів, чому б я просто не змінив суперклас для цього?
У статті був ще один рядок:
Візерунок декораторів є альтернативою підкласифікації. Підкласифікація додає поведінку під час компіляції, і зміна впливає на всі екземпляри оригінального класу; декорування може забезпечити нову поведінку під час виконання окремих об’єктів.
Я не знаходжусь там, де вони кажуть "... зміна впливає на всі екземпляри початкового класу" - як підкласифікація змінює батьківський клас? Чи не в цьому вся суть підкласифікації?
Я припускаю, що стаття, як і багато Вікі, просто не написана чітко. Я бачу корисність декоратора в останньому рядку - "... забезпечити нову поведінку під час виконання окремих об'єктів".
Не читаючи про цю закономірність, якщо мені потрібно змінити поведінку під час виконання окремих об'єктів, я, мабуть, вбудував би деякі методи в над- або підклас, щоб увімкнути / відключити цю поведінку. Будь ласка, допоможіть мені реально зрозуміти корисність декоратора, і чому моє мислення для новачків є хибним?