Накопичувач (шаблон проєктування)
Зовнішній вигляд
Накопичувач (англ. Collecting Parameter) — шаблон проєктування, який пропонує накопичувати повідомлення про стан об'єкту.
Нехай, необхідно показувати повідомлення про зміну стану об'єкту. Оскільки наперед не відомо середовище розгортання даного об'єкту, накопичуватимемо повідомлення в пам'яті, а відповідальність відображення реалізуємо в залежності від середовища.
typedef vector<string> CollectingParameter;
struct Filler
{
void f(CollectingParameter& cp)
{
cp.push_back("accumulating");
// Do something else
}
void g(CollectingParameter& cp)
{
cp.push_back("items");
// Do something else
}
void h(CollectingParameter& cp)
{
cp.push_back("as we go");
// Do something else
}
};
void main()
{
Filler filler;
CollectingParameter cp;
filler.f(cp);
filler.g(cp);
filler.h(cp);
// вивід повідомлень залежить від середовища, наприклад, у консоль
// вебсервер міг би показувати дані у вигляді сторінки, тощо
for (vector<string>::iterator it = cp.begin(); it != cp.end(); ++it)
{
cout << *it << ' ';
}
}
Даний шаблон може бути корисний, коли необхідно виконати відкладену валідацію.
public class HomeController
{
public ActionResult Index(string value)
{
if(string.IsNullOrEmpty(value))
{
ModelState.AddModelError("value", "There is something wrong with value.");
}
. . .
IEnumerable<ModelError> allErrors = ModelState.Values.SelectMany(v => v.Errors);
. . .
}
}
Одна із різновидностей цього шаблону передбачає для накопичення повідомлень використовувати властивості, а не структуру даних.