Я работаю над приложением, модуль которого последовательно выполняет следующие финансовые операции:
Когда пользователь запрашивает перевод определенной суммы на свой банковский счет:
- проверить, может ли какая-либо транзакция произойти сейчас? (транзакция может быть осуществлена только в течение определенного периода времени)
- проверьте, запросил ли пользователь минимальную сумму для снятия
- проверьте, есть ли у пользователя учетная запись по умолчанию
Результат всех вышеперечисленных действий должен быть зарегистрирован.
Если все вышеперечисленное условие удовлетворяет, сделка выполняется. В будущем могут быть некоторые дополнительные проверки.
Какой объектно-ориентированный шаблон проектирования лучше всего подходит для вышеуказанного случая?
Ответы:
Похоже, что вы ищете, это цепь ответственности . В этом случае вы можете иметь следующие классы:
TransactionValidatorBase
абстрактный базовый классTransactionTimeValidator
TransactionAmountValidator
TransactionAccountValidator
Они объединены в цепочку, чтобы применить любое количество правил, которые вы укажете.
Furter Reading
источник
Если ваша последовательность шагов выполняет в основном обязанности проверки (как вам кажется), не изменяя входные данные, я действительно подумаю о шаблоне «Цепочка ответственности», как объяснил в своем ответе @pswg
Но поскольку ваш вопрос немного более общий, я хотел бы также добавить «конвейерную обработку», поскольку с этим шагом шаг будет производить выходные данные, которые станут входными данными для следующего шага (таким образом, изменяя исходный ввод) ,
Вот две статьи об этом:
Сборник конвейеров Мартина Фаулера
Более теоретическое обсуждение паттерна
источник
Правильный шаблон здесь действительно зависит от контекста. Прежде чем выбрать какой-то конкретный шаблон, я постараюсь найти ответы на эти вопросы:
Основываясь на интуиции, я бы написал их как простые методы с агрегирующим параметром для кодов ошибок.
Возможно, было бы неплохо поместить DoTransaction в интерфейс «ITransactionValidationStragegy» и создать супертип слоя, который будет содержать шаблонный код проверки.
Однако в этом проекте я предполагаю, что логика проверки определяется во время компиляции.
источник
Хотя шаблоны уже упоминались здесь, я бы посоветовал вам подумать о том, как бы вы хотели использовать то же самое в своем приложении, основываясь на используемых вами платформах.
Например, валидация, которую вы хотели бы сделать, скорее всего, будет меняться с течением времени (возможно, вы захотите добавить новую валидацию в будущем, которая ограничивает транзакции до 10 в день). Кроме того, вы, возможно, не захотите выполнять проверку до того, как начнет действовать ваш фактический бизнес-сервис или код интеграции. Было бы хорошо, если бы вы могли добавлять проверки как настраиваемые.
В случае, если вы используете Struts, использование перехватчиков может быть хорошей идеей. В случае весны инъекция бобов как зависимость дает вам больше гибкости. Я предлагаю не только взглянуть на шаблоны / идиомы, но также взглянуть на среду, которую вы используете для создания приложения, и увидеть, насколько лучше вы можете соответствовать вашим требованиям с футуристической точки зрения.
источник
Насколько я понимаю, все, что требуется, может быть встроено в шаблон команды, как показано ниже. Дизайн класса может быть сделан согласно ниже.
Ваш класс Client будет содержать следующий фрагмент кода:
Это, как я понимаю, со сценарием, который был приведен выше.
источник