это шаблон дизайна? - PullRequest
       14

это шаблон дизайна?

4 голосов
/ 17 апреля 2010

Мне нужно составить некоторый отчет о финансовых данных, и для выполнения расчета существует множество ситуаций «если тогда»: если это большой клиент, вычтите 10%, если его почтовый индекс равен «10101», добавьте 10 %, если день в субботу, сделать сложный расчет и т. д.

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

Чтобы поместить то, что я запомнил, в псевдокоде

Basecalc bc = new baseCalc();
//put the info in the bc so other objects can do their if
bc.Add(new Largecustomercalc());
bc.Add(new PostalcodeCalc());
bc.add(new WeekdayCalc());

bc запускает методы Calc () для всех добавленных объектов Calc. Когда я набираю это, я думаю, что все объекты Calc должны видеть свойства Basecalc, чтобы правильно выполнять свою логику вычислений.

Таким образом, все if находятся в разных объектах Calc, а не ВСЕ в Basecalc.

имеет ли это смысл?

Мне было интересно, это какой-то шаблон дизайна?

Ответы [ 4 ]

5 голосов
/ 18 апреля 2010

Как предполагает dtb, Цепочка ответственности представляется наиболее применимой здесь с небольшим изменением: как правило, Цепочка ответственности находит ровно один обработчик , а затем завершается. Если крупный клиент заказал в субботу, вам нужно выполнить два обработчика. Обратите внимание, что это является нетривиальным расширением, потому что ваш объект мог измениться за это время, и упорядочение обработчиков становится актуальным. Это может быть очень сложно. Например. Что делать, если есть скидка 10 долларов и скидка 10%? Теперь порядок операций имеет значение, если только оба не работают по первоначальной цене. Вы поняли идею, я думаю.

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

Во-первых, желательно, чтобы конкретные реализации выполняли проверку, действительно ли они применимы к рассматриваемому предмету, что типично для Цепочки ответственности.

Во-вторых, то, что вам нужно, будет вести себя по-разному в зависимости от фактических данных в вашем объекте. Шаблон Strategy просто инкапсулирует различные алгоритмы, которые, по сути, достигают одного и того же (то есть, у вас могут быть разные стратегии для расчета скидки 10%, но все они должны давать одно и то же значение).

Шаблон Command является шаблоном развязки для фактического запроса на выполнение операции, например, если вы хотите, чтобы кто-то еще рассчитал скидку, вы бы создали объект Command для этого. Фактически обработчиками (многоадресных) событий часто являются Chains of Responsibility .

Шаблон Composite создан для древовидных структур, где вы можете составлять объекты так же, как в реальном мире. Это связано с проблемой, упомянутой ранее: если вы представляете свою цепочку ответственности как вырожденное поддерево (без ветвей), у вас будет упорядоченный список, и вы можете сначала представить разницу между вычитанием 10 долл. США, затем 10% или другим способом. вокруг. В этом смысле его можно понимать как вырожденный композит. Композит может быть использован для описания конкретной схемы дисконтирования. Тем не менее, выбор и применение схемы было бы работой Цепочки Обязательств.

Как я уже сказал, это не четкие термины, они тесно связаны друг с другом, часто встречаются в вариациях (и в злоупотреблениях), и, что наиболее важно, каждый шаблон нуждается в некоторых изменениях для вашей конкретной проблемы. Тем не менее, я бы предпочел придерживаться терминологии Chain of Responsibility с несколькими вариациями, потому что я считаю, что она наиболее близка к ситуации, которую вы описываете.

3 голосов
/ 17 апреля 2010

Похоже, шаблон стратегии для меня. Возможно, смешано с Composite pattern , так как вы можете добавить реализации Вычисления к вашему объекту.

1 голос
/ 17 апреля 2010

Там, кажется, работают две модели, в зависимости от того, на что вы смотрите. Если вы говорите о делегировании работы списку элементов с помощью стандартного метода «вычисления», то это пример Шаблон команды . Если вы говорите о реализации классов калькулятора, это шаблон Decorator .

0 голосов
/ 25 мая 2011

Это не цепь ответственности, а цепь ответственности имеет совершенно иное назначение. Это комбинация шаблонов команд (без отмен / повторов) и составных (составление команд). Как отмечали другие, вы также можете считать его частью Стратегии, но, опять же, он выродился, чтобы стать хорошим примером для Стратегии. Некоторые люди, возможно, назвали бы это «внутренним DSL». Как указывало большинство людей: вы не можете определить, что это такое, так как это зависит от вашей точки зрения. Если в ваших расчетах используется более одного метода, и алгоритм обхода вызовет их все - или подмножество в зависимости от оперантов, например - это была бы Стратегия, единственное, что несомненно, это «Композит».

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