Существует несколько способов реализации шаблона стратегии на C++.
- Используйте метод ООП, как на других языках программирования.
- Используйте объект функции.
- Используйте класс политики.
Все трое могут выполнить свою работу так, чтобы выбрать, сильно зависит от вашей проблемы.
Вы упомянули, что хотите использовать стратегию для рисования диаграммы. На мой взгляд, это сложный прецедент, и вы пойдете с вариантом один, потому что ваш объект стратегии может запрашивать настройки, такие как предпочтительные цвета, и так далее, и вы можете захотеть сохранить стратегии где-нибудь, чтобы пользователь мог выбрать их в поле со списком.
Функциональный объект действительно хорош, если вы хотите предоставить клиентам (вашим коллегам) большую гибкость.В моем текущем проекте мы используем функциональные объекты для тестирования стоп-критерия в алгоритме. Это очень хорошо с lambdas в C++ 11, пока функциональность не становится слишком сложной.
Путь к политике может быть самым быстрым, но он должен знать тип во время компиляции. При использовании этого модуля не поддерживаются DLL. По крайней мере, пока вы не инкапсулировать реализацию в иерархии классов:
template <class LockPolicy>
class MyClass
{
void do_something()
{
LockPolicy::lock();
//...
LockPolicy::unlock();
}
};
Я думаю, что хорошие советы являются:
- Использование 1. Если стратегия является сложной и может запросить другие системы.
- Использование 1. Если вы хотите новые реализаций стратегии от плагина в
- Использования 2. если стратегия может быть выражены в коротких строках кода
- Использование 2. Если реализации стратегий подходят свободные функции и вы не хотите ввести иерархию классов
- Используйте 3. если вы действительно знаете, что делаете, и вам нужна производительность.
Внесите * что * "операция"? Что вы считаете «лучшим» (это очень субъективное слово)? Каков ваш прецедент? –
Я имею в виду операцию, которая позволяет выбирать поведение алгоритма во время выполнения. – ElConrado
C++ 11? См. Lambdas и 'std :: function <>' –