🕵️
Введение в паттерны
  • Введение в паттерны
  • Паттерны
    • Оглавление
    • Порождающие паттерны
      • Фабричный метод
        • Реализации на С++
        • Реализации на Kotlin
        • Возможные реализации для решения конкретных задач на С++
      • Абстрактная фабрика
        • Реализации на С++
        • Реализации на Kotlin
        • Возможные реализации для решения конкретных задач на С++
      • Прототип
        • Реализации на С++
        • Реализации на Kotlin
        • Реализации на Java
        • Возможные реализации для решения конкретных задач на С++
      • Строитель
        • Реализации на С++
        • Реализации на Kotlin
      • Одиночка
        • Реализации на C++
        • Реализации на Kotlin
        • Возможные реализации для решения конкретных задач на С++
      • Пул объектов
        • Реализации на С++
    • Структурные паттерны
      • Адаптер
        • Реализации на С++
        • Реализации на Kotlin
        • Возможные реализации для решения конкретных задач
      • Декоратор
        • Реализации на С++
        • Реализации на Kotlin
      • Компоновщик
        • Реализации на С++
      • Мост
        • Реализации на С++
      • Заместитель
        • Реализации на С++
        • Реализации на Kotlin
      • Фасад
        • Реализации на С++
      • Приспособленец
        • Реализации на С++
    • Поведенческие паттерны
      • Стратегия
        • Реализации на С++
        • Реализации на Kotlin
      • Команда
        • Реализации на С++
        • Реализации на Kotlin
      • Цепочка обязанностей
        • Реализации на С++
        • Реализации на Kotlin
      • Подписчик-издатель
        • Реализации на С++
        • Реализации на Kotlin
      • Посетитель
        • Реализации на С++
        • Возможные реализации для решения конкретных задач
      • Посредник
        • Реализации на С++
        • Реализации на Kotlin
      • Шаблонный метод
        • Реализации на С++
      • Опекун
        • Реализации на С++
      • Итератор
        • Реализации на С++
        • Реализации на Kotlin
      • Свойство
        • Реализации на С++
        • Возможные реализации для решения конкретных задач
  • Введение в идиомы
  • Идиомы
    • Оглавление
    • RAII
    • Type erasure
      • Контейнеры с type erasure
    • CRTP
    • Статический полиморфизм
    • Shrink to fit
    • Proxy
    • Erase remove
    • Decltype (auto)
    • Copy and swap
    • Safe bool
    • Scope guard
    • Addressof
Powered by GitBook
On this page

Was this helpful?

  1. Паттерны
  2. Поведенческие паттерны
  3. Цепочка обязанностей

Реализации на С++

Chain of Responsibility

Общая реализация на языке С++

class AbstractHandler
{
	using PtrAbstractHandler = shared_ptr<AbstractHandler>;
protected:
	PtrAbstractHandler next;

	virtual bool run() = 0;

public:
	using Default = shared_ptr<AbstractHandler>;

	virtual ~AbstractHandler() = default;

	virtual bool handle() = 0;

	void add(PtrAbstractHandler node);
	void add(PtrAbstractHandler node1, PtrAbstractHandler node2, ...);
	void add(initializer_list<PtrAbstractHandler> list);
};
class ConcreteHandler : public AbstractHandler
{
private:
	bool condition
	{ 
		false 
	};

protected:
	virtual bool run() override 
	{ 
		cout << "Method run;" << endl; 
		return true; 
	}

public:
	ConcreteHandler() : ConcreteHandler(false) {}
	
	ConcreteHandler(bool c) : condition(c) 
	{ 
		cout << "Constructor;" << endl; 
	}
	
	virtual ~ConcreteHandler() override 
	{ 
		cout << "Destructor;" << endl; 
	}

	virtual bool handle() override
	{
		if (!condition) return next ? next->handle() : false;

		return run();
	}

};
#pragma region Methods

void AbstractHandler::add(PtrAbstractHandler node)
{
	if (next)
		next->add(node);
	else
		next = node;
}

void AbstractHandler::add(PtrAbstractHandler node1, PtrAbstractHandler node2, ...)
{
	for (Default* ptr = &node1; *ptr; ++ptr)
		add(*ptr);
}

void AbstractHandler::add(initializer_list<PtrAbstractHandler> list)
{
	for (auto elem : list)
		add(elem);
}

#pragma endregion
# include <iostream>
# include <initializer_list>
# include <memory>

using namespace std;

int main()
{
	shared_ptr<AbstractHandler> chain = make_shared<ConcreteHandler>();

	chain->add(
		{
		make_shared<ConcreteHandler>(false),
		make_shared<ConcreteHandler>(true),
		make_shared<ConcreteHandler>(true),
		AbstractHandler::Default()
		}
	);

	cout << "Result = " << chain->handle() << ";" << endl;
}
PreviousЦепочка обязанностейNextРеализации на Kotlin

Last updated 1 year ago

Was this helpful?