Накопичувач (шаблон проєктування)

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

Накопичувач (англ. 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);
        . . .
    }
}

Одна із різновидностей цього шаблону передбачає для накопичення повідомлень використовувати властивості, а не структуру даних.

Див. також[ред. | ред. код]

Джерела[ред. | ред. код]