2010-04-17 2 views
4

Мне нужно собрать отчет о финансовых данных, и для расчета есть много ситуаций «если»: если это большой клиент, вычтите 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()); 

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

Итак, все символы if находятся в разных объектах Calc, а не в ALL в Basecalc.

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

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

+5

Похоже, вы ищете узор Decorator? (сорт) –

+0

Это довольно похоже на пример использования декоратора в «Head First Design Patterns» (в качестве примера они использовали расчет цен на горячие напитки). Может быть, вы его прочитали? –

+0

* Цепь ответственности * Модель или * Стратегия * Возможно, шаблон? – dtb

ответ

5

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

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

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

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

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

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

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

+0

правый! в этом вопросе должен был быть и порядок. Большое спасибо за ваш обширный ответ! Michel

1

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

3

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

+0

Я прочитал об этой стратегии: «Проще говоря, объект и его поведение разделяются и помещаются в два разных класса. Это позволяет вам переключать алгоритм, который вы используете в любое время. « это звучит, что я хочу сделать, я тоже проверю состав – Michel

+0

Я тоже думал о стратегии + композит. –

0

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

Смежные вопросы