Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Различия между шаблоном "Мост" и "Стратегия" (http://www.flasher.ru/forum/showthread.php?t=176310)

angorow 07.03.2012 00:20

Различия между шаблоном "Мост" и "Стратегия"
 
Здравствуйте!

В данной беседе хочется найти объективные различия этих двух шаблонов, кроме различий которые содержатся в их описании.

Стратегия— поведенческий шаблон проектирования, предназначенный для определения семейства алгоритмов, инкапсуляции каждого из них и обеспечения их взаимозаменяемости. Это позволяет выбирать алгоритм путем определения соответствующего класса. Шаблон Стратегия позволяет менять выбранный алгоритм независимо от объектов-клиентов, которые его используют.

http://upload.wikimedia.org/wikipedi...gy_pattern.PNG
Шаблон "стратегия": http://ru.wikipedia.org/wiki/%D0%A1%...D%D0%B8%D1%8F)

Мост — шаблон проектирования, используемый в проектировании программного обеспечения чтобы «разделять абстракцию и реализацию так, чтобы они могли изменяться независимо». Шаблон bridge (от англ. — мост) использует инкапсуляцию,агрегирование и может использовать наследование для того, чтобы разделить ответственность между классами.
http://upload.wikimedia.org/wikipedi.../Bridgeuml.gif
Шаблон "мост":http://ru.wikipedia.org/wiki/%D0%9C%...BD.D0.B8.D0.B5

Раунд 1 собственно.

Я думаю нужно начать с решения(рационального решения) конкретной задачи. Допустим есть:

http://imglink.ru/thumbnails/06-03-1...d67af849e5.jpg

C (A, B, C) все предельно просто (B, C) расширяют A, полиморфизм хорошо здесь выполняет свои задачи, но на сцене появляются (D, E, F).

http://imglink.ru/thumbnails/06-03-1...d6a7897d1e.jpg

Здесь начинается самое интересное! Мы видим, что функционал (D, E, F) может быть добавлен к любому из (B, C). Как быть? Наследование в данном случае будет не эффективно(речь конечно же идет только о AS3).
В данном случае логично применить ход, который заключается в описании шаблонов “Стратегия” или “Мост”?

Очень интересны ваши мнения по этому поводу!
Заранее благодарен!

СлаваRa 07.03.2012 00:28

Надеюсь это вам поможет
Цитата:

но на сцене появляются (D, E, F).
С какой целью?
Цитата:

Здесь начинается самое интересное! Мы видим, что функционал (D, E, F) может быть добавлен к любому из (B, C).
А можете развернуто объяснить эту строчку?
Цитата:

Наследование в данном случае будет не эффективно(речь конечно же идет только о AS3).
AS3 не поддерживает множественное наследование

angorow 07.03.2012 00:35

Здравствуйте!
Читайте пост внимательно! Все в посте!
Цель здесь абсолютно не имеет значения, придумайте любую цель и подставьте вместо буквы...
Кто говорит про множественное наследование? Где я сказал, что оно есть?
По этой причине речь и идет о паттернах "Мост" и "Стратегия"

Yahen 07.03.2012 01:23

И все же. Чем Вас не устраивает обычная инкапсуляция? Без кодовой обертки конструкторов?
На случай если B и С в качестве общего предка имеют что-то недалеко отошедшее от простого object, в AS3 есть интерфейсы, облегчающие доступ к методам не имеющим общего предка.
Тем более, что и стратегия и мост, как, впрочем и фабрика не столь очевидны в реализации и использовании, если Ваши ABC растут от DisplayObject.

angorow 07.03.2012 01:34

Еще раз добрый вечер!
Да меня все устраивает и я сам этим пользуюсь, но....о... На днях наткнулся на "битву титанов", которая собственно была приурочена статье одного из этих “титанов” на тему “Bridge”, в статье был пример из-за, которого и развилась эта баталия. А разногласия заключались в том, что одни считали это “Стратегия”, другие считали, что это “Мост”. И все это длилось в течении 100 постов. Итог: внятно ни кто не смог объяснить разницу между двумя этими шаблонами, кроме как дать скупую цитату из описания этих шаблонов.
А вопрос еще раз для вас в сабже))).

Добавлено через 5 минут
Цитата:

Сообщение от Yahen (Сообщение 1067601)
есть интерфейсы, облегчающие доступ к методам не имеющим общего предка.

И Interface здесь ну......! Вы предлагает одну и ту же реализацию переписывать по n-раз? Противоречит предназначению Interface. Может я вас не правильно понял.

gloomyBrain 07.03.2012 01:50

Цитата:

Противоречит предназначению Interface. Может я вас не правильно понял.
Может Вы неправильно поняли предназначение интерфейсов? =) За интерфейсом может быть любая реализация, хоть через наследование, хоть через композицию. Как бы то ни было, не писать код по n раз вполне реально.

angorow 07.03.2012 01:55

Здравствуйте!
Вы все на 100% поняли наоборот! Я и говорю о том, что Interface приводит различные реализации к одной спецификации. Согласны? Если да читайте все с начала, в первом моем посте есть две диаграмки с зелеными кубиками.

gloomyBrain 07.03.2012 01:58

Здравствуйте! Перечитайте свой пост (№5). В нем говорится, что написание кода n раз противоречит смыслу интерфейсов. Так вот - не противоречит. Вообще все равно, что там за код скрыт за интерфейсом. Согласны? Если нет - читайте все сначала.

angorow 07.03.2012 02:03

Еще раз первый пост! Я и говорю, что из слов

Сообщение от Yahen
есть интерфейсы, облегчающие доступ к методам не имеющим общего предка.

применительно к диаграммам в первом сообщении код реализации интерфейса будет один и тот же для каждого случая, что есть бред! Будьте пожалуйста внимательнее.

gloomyBrain 07.03.2012 02:07

Почему бред? Вы попрбуйте применить тут композицию - все встанет на свои места. Да, код будет один и тот же. Более того - он и написан будет один раз, в нужных классах-"запчастях". Это даст Вам возможность собирать как из кубиков лего любую конкретную реализацию интерфейса.
И при чем тут мое внимание?

angorow 07.03.2012 02:21

Специально для Вас!

Код AS1/AS2:

        public interface IA 
        {
                function execute():void;
        }
 
        public class B implements IA
        {
 
                public function B()
                {
 
                }
 
                /* INTERFACE IA */
 
                public function execute():void
                {
 
                }
 
        }
 
        public class C implements IA
        {
 
                public function C()
                {
 
                }
 
                public function execute():void
                {
 
                }
 
        }

и есть

Код AS1/AS2:

        public interface IF 
        {
                function printLetterA():void;
        }

реализация printLetterA для B и C одна и таже

Котяра 07.03.2012 02:26

Декоратор?
:)

angorow 07.03.2012 02:30

Цитата:

Сообщение от Котяра (Сообщение 1067616)
Декоратор?
:)

Здравствуйте!
А почему не "Стратегия" или "Мост"?:)

Добавлено через 1 минуту
И декоратор тут не подойдет, у них должен быть общий интерфес тогда....

Котяра 07.03.2012 02:34

У стратегий и мостов тоже обычно общий интерфейс. Определитесь точнее, что вам надо.
А вообще эти 3 понятия могут пересекаться по разному.
Например одна из стратегий может быть просто комбинированной обёрткой-декоратором над чем нибудь ещё. Или мостом.
Т.е. один и тот же класс можно обозвать по разному. Зависит от контекста.

angorow 07.03.2012 02:35

Это смотря откуда смотреть))) А вопрос в сабже! Различия между шаблоном "Мост" и "Стратегия"

Добавлено через 8 минут
Не совсем согласен, но до ладно давайте от другого пойдем... пост №11 ваша реализация и название шаблона, который вы будете использовать. Если можно конечно.

Котяра 07.03.2012 02:52

В и С по отношению к IA - стратегии
по отношению к IF - тоже стратегии, но т.к. сами не реалтзуют этот функционал а используют какой то класс F, то по отношению к F они мосты и декораторы.
Как то так.
Спать пора)

K.A.T.A.F.A.L.K.E.R 07.03.2012 02:58

можно глянуть перед сном
http://www.youtube.com/watch?v=zI4icUNXgWk

angorow 07.03.2012 03:02

Цитата:

Сообщение от Котяра (Сообщение 1067624)
В и С по отношению к IA - стратегии
по отношению к IF - тоже стратегии, но т.к. сами не реалтзуют этот функционал а используют какой то класс F, то по отношению к F они мосты и декораторы.
Как то так.
Спать пора)

:D истина где то рядом!
На самом деле я в первом сообщении написал цель по, которой я развил данную тему. Понятно, что решений много, а названий можно придумать еще больше... Интересен факт, который я описал в пост №5.

Котяра 07.03.2012 03:07

Хорошо объясняет, как я и сказал. стратегия, мост и декоратор(делегат) все вместе)

angorow 07.03.2012 03:07

Цитата:

Сообщение от K.A.T.A.F.A.L.K.E.R (Сообщение 1067625)
можно глянуть перед сном
http://www.youtube.com/watch?v=zI4icUNXgWk

Здравствуйте!
Очень приятно!
Да мы о том же...:), спасибо за ссылку!
Но она, как бы она очередной дубль информации, которую мы собственно и обсуждаем. Нового к сожалению=0.
Хочется получить ответ на сабж. Если его в принципе нельзя сформулировать встают другие вопросы...

Добавлено через 4 минуты
Обсуждение уходит все время не в другую плоскость. Разговор идет не о том, что такое "Мост" и "Стратегия", а о том чем они отличаются. Вот я смотрю на UML диаграммы из пост №1 и верю своим глазам, по сути это =

Котяра 07.03.2012 03:12

это как разница между жидкостью и молоком.
Стратегия разрешает использовать объекты по их общему интерфейсу.
А мост это паттерн позволящий вместо наследования использовать делегирование.
Сам мост в этом случае явлеятся декораторм прикрывющим старатегии)

angorow 07.03.2012 03:15

Идем от другого один поведенческий другой структурный. Правильно?

Котяра 07.03.2012 03:17

Да! Можно и так сказать.

angorow 07.03.2012 03:24

Так оно так и есть по классическому определению.) Реализация решения очевидна, но вот определение этой реализации...

Добавлено через 2 минуты
Цитата:

Сообщение от Котяра (Сообщение 1067631)
это как разница между жидкостью и молоком.

Если мы говорим об утолении жажды, то согласен, а если о других свойствах нет...)))

Wolsh 07.03.2012 10:34

Все же смысл Стратегии в предоставлении алгоритма, даже не метода в широком смысле (алгоритм ничего не знает о внутреннем устройстве клиента и может изменять только те данные, которые дали ему в обработку, в то время как "метод вообще" может оперировать членами класса-клиента/хозяина). А смысл Моста в предоставлении целой иерархии взаимосвязанных классов, "модуля". Скажем, на примере игры: если Вы взяли огнемет, то взяли также бак горючего, систему охлаждения и варежки. Взяли АК47 – взяли набор патронов такого-то калибра, штык-нож и оптический прицел. И огнемет, и АК47 – абстрактно Оружие. Но ситуация выбора/замены здесь это не Стратегия. Это Мост. "Оружие" – это не поведение, это структура. Стратегия – когда из АК47 Вы стреляете разрывными или трассирующими, и абстракция "выстрел" конкретно отображается разными способами. Мост предоставляет систему взаимосвязанных классов, а Стратегия - способ выполнения действия. Диаграммы похожи – ну а с чего им различаться, они показывают только абстрактную схему "выбор и замена". Схема отношений одна, фигуранты – разные.

angorow 07.03.2012 15:38

Здравствуйте!

Цитата:

Сообщение от Wolsh (Сообщение 1067647)
Все же смысл Стратегии в предоставлении алгоритма, даже не метода в широком смысле (алгоритм ничего не знает о внутреннем устройстве клиента и может изменять только те данные, которые дали ему в обработку, в то время как "метод вообще" может оперировать членами класса-клиента/хозяина).

Имплементация тоже не знает абсолютно ничего о абстракции и предоставляет только интерфейс. В плане доступа к членам класса тоже различий нет) Извините не убедительно.

Цитата:

Сообщение от Wolsh (Сообщение 1067647)
А смысл Моста в предоставлении целой иерархии взаимосвязанных классов

Не согласен...

Цитата:

Сообщение от Wolsh (Сообщение 1067647)
Скажем, на примере игры: если Вы взяли огнемет, то взяли также бак горючего, систему охлаждения и варежки. Взяли АК47 – взяли набор патронов такого-то калибра, штык-нож и оптический прицел. И огнемет, и АК47 – абстрактно Оружие.

На мой взгляд фабрика в чистом виде. Цель оружия стрелять, чем не важно.. Есть интерфейс стрельбы.

Цитата:

Сообщение от Wolsh (Сообщение 1067647)
Но ситуация выбора/замены здесь это не Стратегия. Это Мост.

Мост бы был если бы вы вот этот бак для огнемета хотели прикрутить к АК47 и оптику ко всему... Был бы мост.

Цитата:

Сообщение от Wolsh (Сообщение 1067647)
Мост предоставляет систему взаимосвязанных классов

не согласен

Цитата:

Сообщение от Wolsh (Сообщение 1067647)
, а Стратегия - способ выполнения действия

это очевидно
--------------------------------------------------------------------------------------------------------------
Спасибо!

dimarik 07.03.2012 18:26

Может его сразу забанить? Злой он какой-то. Сплошные "не согласен". )

K.A.T.A.F.A.L.K.E.R 07.03.2012 19:17

Имхо перенести во флейм :)
Насколько я понимаю никакого практического применения топик не имеет, автору всего лишь захотелось пофилософствовать. Или может действительно практическая задача не решится пока не станет ясна разница между паттернами? :)

Wolsh 07.03.2012 19:29

Ага, ожидал такой реакции. Что ж, тогда конкретней. Но не намного))

Рассмотрим последовательность.
Персонаж выбирает "оружие", берет "оружие", "прицеливается", "стреляет".
Мост:
выбратьОружие(Огнемет), взятьОружие(), прицелиться(), стрелять().
Стратегия:
выбратьОружие(Огнемет), взятьОружие(Огнемет), прицелиться(Огнемет), стрелять(Огнемет).

Так понятней?
Цитата:

Мост бы был если бы вы вот этот бак для огнемета хотели прикрутить к АК47 и оптику ко всему... Был бы мост.
Мост для того, чтобы к АК47 прикручивали рожок с патронами, а не несовместимые предметы. Это абстракция "снаряды", и Мост диктует ее реализацию в заданной системе - АК47.
Цитата:

Цель оружия стрелять, чем не важно.
Если Вы рассматриваете ОДИН метод, то никогда и не поймете разницы между Мостом и Стратегией. Потому что Стратегия это всегда один метод, а Мост – класс, который может быть фасадом, фабрикой, стратегией, чем угодно. Но если Вы берете Мост как объект с единственным методом, то получаете аналог Стратегии, конечно.

angorow 07.03.2012 20:04

Закройте тему пожалуйста! Все это лирика... Спасибо!

dimarik 07.03.2012 20:53

И не подумаем!

terbooter 09.03.2012 22:42

Полностью согласен с объяснением Wolsh.

alatar 29.03.2012 20:17

Различия.

wvxvw 29.03.2012 21:39

Недавно попалось изложение интересной беседы по другому поводу, но там, в том числе было и про шаблоны, и в том числе про недостатки. Идея заключалась в том, что языки со статической типизацией и объектность плохо совместимы. Уже само по себе наличие такой проблемы (как создать множество наследников разных классов с похожим поведением) вызвано этими двумя свойствами языка. (Я говорю про видео, где человек прикручивает костыли к Явовской / Сишарповской объектной модели).
Не знаю... в данном контексте хорошего решения нет. На практике - нужно смотреть по обстоятельствам, чем проще будет пожертвовать, какие конкретные требования существуют. Иногда даже банальное копирование кода оказывается лучшим решением чем нагромождение абстрактных классов - если скопировать нужно всего пару строчек. Если это позволит программе оставаться модульной иногда лучше чем придумывать интерфейсы / абстрактные классы, которые все равно либо притянут кучу зависимостей, либо не дадут достаточной гарантии относительно взаимодействующих сторон.

Что до вопроса в заголовке темы: ну, перед вами есть пример с тысячелетней историей того, как люди необоснованно и неукоснительно дословно соблюдали набор принципов, которы зачастую не то, что не имел ничего общего с действительностью, но даже вредил особо рьяным исполнителям.
Скорее всего "мост" и "стратегия" взаимозаменимы / зависят от точки зрения того, кто их описывает.
Что вики говорит по этому поводу:

Цитата:

The UML class diagram for the Strategy pattern is the same[further explanation needed] as the diagram for the Bridge pattern. However, these two design patterns aren't the same in their intent. While the Strategy pattern is meant for behavior, the Bridge pattern is meant for structure.
The coupling between the context and the strategies is tighter than the coupling between the abstraction and the implementation in the Bridge pattern.
Что в переводе на человеческий:
Цитата:

Это одно и то же, просто кому-то надо было реферат дотянуть до нужного количества страниц, а преподаватель не разрешил шрифы растягивать.


Часовой пояс GMT +4, время: 21:39.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.