|
|
|
visitor design pattern.
|
|||
|---|---|---|---|
|
#18+
За основу возьму описание на русской википедии. Мне кажется тамошнее описание похоже на все остальные. http://ru.wikipedia.org/wiki/Посетитель_(шаблон_проектирования) приведу некоторые выдержки: wiki Задача Над каждым объектом некоторой структуры выполняется одна или более операций. Нужно определить новую операцию, не изменяя классы объектов . автор Использование Если есть вероятность изменения иерархии обслуживаемого класса, либо она будет нестабильной или открытый интерфейс достаточно эффективен для доступа шаблона, то его использование будет вредоносным. Создается базовый класс Visitor с методами visit() для каждого подкласса родительского Element. Добавьте метод accept(visitor) в иерархию Element. Для каждой операции, которая должна выполняться для объектов Element, создайте производный от Visitor класс. Реализации метода visit() должны использовать открытый интерфейс класса Element. В результате: клиенты создают объекты Visitor и передают их каждому объекту Element, вызывая accept(). уже тут противоречие вижу. в первой цитате написано, что без изменений, а тут пишут "Добавьте метод accept(visitor) в иерархию Element" Как я могу добавить метод в иерархию без изменения этих классов? не понимаю кто такой обслуживаемый класс. кто кого обслуживает? Чем решение просто сделать базовый абстрактный класс, реализовать этот новый метод как-то по дефолтному и переопределить где надо в наследниках хуже? всё равно ж менять код классов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2014, 20:48 |
|
||
|
visitor design pattern.
|
|||
|---|---|---|---|
|
#18+
questionerЧем решение просто сделать базовый абстрактный класс, реализовать этот новый метод как-то по дефолтному и переопределить где надо в наследниках хуже? всё равно ж менять код классов. Так автор прямо говорит, что если у вас ситуация банальная, когда все решается одним методом, то этот паттерн только хуже сделает. Он хорошо подходит, когда объект проходит несколько обработчиков и таким образом методов будет много, а не один. В вашем примере, надо будет на каждый новый обработчик добавлять метод в классы. А при использования паттерна, может быть сколько угодно обработчиков без изменения класса. questionerне понимаю кто такой обслуживаемый класс. кто кого обслуживает? Ну как кто? Есть обрабатываемый объект, есть его обработчики. Ну вот как пример представьте себе больного и врачей. Больной это обслуживаемый класс, а врачи это и есть посетители. Больной сидит в палате и понятия не имеет (в идеале не должен конечно) какой к нему сейчас зайдет врач и какую операцию будет делать. Врачи больного "посещают" и делают свое дело. Отюда и название "посетитель". Одного больного может лечить неустановленное число врачей. Если ситуация простая, всех больных обслуживает 1 врач и делает 1 операцию, то и заморачиваться не стоит. А вот если врачей может быть много, и операции они делают разные, то получим знатную лапшу в коде. Паттерн позволяет добавлять любое количество врачей с разными операциями, не беспокоя больного. Надеюсь аналогия понятна)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.05.2014, 22:34 |
|
||
|
visitor design pattern.
|
|||
|---|---|---|---|
|
#18+
Ищущий Знания, Ищущий ЗнанияБольной сидит в палате и понятия не имеет (в идеале не должен конечно) какой к нему сейчас зайдет врач и какую операцию будет делать Как же не знает? ведь больной вызывает больной.accept(врач). кстати не понимаю почему этот метод во всех пример называется accept. С чем соглашается то? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2014, 01:06 |
|
||
|
visitor design pattern.
|
|||
|---|---|---|---|
|
#18+
Ищущий Знания, но уже понятнее немного. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2014, 01:07 |
|
||
|
visitor design pattern.
|
|||
|---|---|---|---|
|
#18+
questionerИщущий Знания, Как же не знает? ведь больной вызывает больной.accept(врач). кстати не понимаю почему этот метод во всех пример называется accept. С чем соглашается то? Ну это образно описано), он знает что придет педиатр, а вот что будет делать это уже другой вопрос. Да и не соглашается, а принимает). больной.принять(врач) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2014, 01:11 |
|
||
|
visitor design pattern.
|
|||
|---|---|---|---|
|
#18+
Ищущий Знания, спасибо) на абстракциях понятнее) надо бы только предложенную модель дополнить для законченности.... значит есть у нас абстрактный больной умеющий принимать врача(звать врача), и конкретные с болью в животе, в голове и ногах. и абстрактный врач умеющий посещать. и есть конкретные: врач из поликлинники, выписывающий только таблетки и врач - хирург(допустим тоже такой же многопрофильный умеющий и в голове покапаться и в кишках и в ноге) врач из поликлинники берет пациента и лечит. Код: java 1. 2. 3. 4. 5. 6. 7. Код: java 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.05.2014, 02:21 |
|
||
|
visitor design pattern.
|
|||
|---|---|---|---|
|
#18+
questioner..кстати не понимаю почему этот метод во всех пример называется accept. С чем соглашается то? У некоторых слов бывает несколько значений. http://thefreedictionary.com/accept 1. a. To answer affirmatively: accept an invitation. b. To agree to take (a duty or responsibility). 2. To receive (something offered), especially with gladness or approval: accepted a glass of water; accepted their contract. 3. To admit to a group, organization, or place: accepted me as a new member of the club. 4. a. To regard as proper, usual, or right: Such customs are widely accepted. b. To regard as true; believe in: Scientists have accepted the new theory. c. To understand as having a specific meaning. 5. To endure resignedly or patiently: accept one's fate. 6. To be able to hold (something applied or inserted): This wood will not accept oil paints. 7. To receive officially: accept the committee's report. 8. To consent to pay, as by a signed agreement. 9. Medicine To receive (a transplanted organ or tissue) without immunological rejection. v.intr. To receive something, especially with favor. Often used with of. "Согласиться" - это только 1а. Когда спрашивают принимают ли карту какого-то типа, тоже говорят accept, а не take. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2014, 11:35 |
|
||
|
|

start [/forum/topic.php?fid=59&gotonew=1&tid=2127199]: |
0ms |
get settings: |
8ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
166ms |
get topic data: |
9ms |
get first new msg: |
4ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
| others: | 246ms |
| total: | 498ms |

| 0 / 0 |
