Из того, что вы описали, Декоратор - это не тот шаблон, на который нужно смотреть.
Мне кажется, что вы просто хотите настроить цепочку трансформаторов для работыобщий вектор - то есть простая функциональная композиция .Это отличается от Декоратор с точки зрения отношения к объекту в ядре - вы не строите что-то, чтобы стоило для вектора, вы строите что-то, чтобы оперировал это.Теперь, когда вы берете несколько преобразователей, вы можете теоретически представить второй и последующие преобразователи как декораторы первого, но, учитывая простоту задействованных объектов, попытка применить реализацию декоратора GoF к вашей ситуации, вероятно, будетбыть излишним.
Вы можете поцеловать, сделав что-то вроде этого:
#include <vector>
using namespace std;
typedef vector<int> ivec;
ivec& a(ivec& v) {
v.push_back(1);
return v;
}
ivec& b(ivec& v) {
v.push_back(2);
v.push_back(3);
v.push_back(4);
return v;
}
ivec& c(ivec& v) {
v.pop_back();
return v;
}
Есть три простых функции преобразования, каждая из которых написана так, что выходные данные одной из них можно подавать прямо на входследующего.Затем вы можете сделать что-то вроде:
ivec& xform(ivec& v) {
return c(b(a(v)));
}
ivec v;
xform(v);
, если вы хотите просто статически построить ваше окончательное преобразование и применить его.
В качестве альтернативной реализации, скажем, вы хотели создатькомплект трансформаторов динамически .В этом случае вы можете вставить функции в вектор преобразователей и применить их один за другим:
#include <vector>
using namespace std;
typedef ivec& (*ivec_xformer)(ivec&);
typedef vector<ivec_xformer> xform_vec;
xform_vec xforms;
xforms.add(&a);
xforms.add(&b);
xforms.add(&c);
ivec v;
for (xform_vec::iterator i = xforms.begin(); i != xforms.end(); ++i) {
(*i)(v);
}
Этот цикл в конце, кстати, можно еще больше "упростить" с помощью boost::bind
и std::for_each
если вы так склонны.
Динамическая цепочка трансформаторов имеет некоторое сходство с Chain of Responsibility , за исключением того, что нет концепции, чтобы какой-то конкретный объект остановил цепочку "обрабатывает запрос, т. е. нет реальной ответственности , связанной с этим решением - каждая функция получает равную трещину в векторе.Я бы предположил, что этому шаблону нужно более подходящее имя - оно, вероятно, уже существует, так как такого рода функциональная композиция в ОО-программировании не редкость, но в настоящее время она ускользает от меня.