Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
class Tree
{
public:
virtual void accept(Visitor& visitor)
{
for (int i = 0; i < m_branches.size(); ++i)
{
m_branches[i].accept(visitor);
}
visitor.visit(*this);
}
//...
};
Visitor::visit(Object& object) и ничего не нарисуется.Притом сами запросы и ответы статичны и определены в доменной модели, меняется всего лишь транспорт доставки ответа клиенту. Хотелось бы чтобы доменная модель при возврате ответа играла роль Producer, а конкретный транспорт Consumer. И хотелось бы чтобы Producer генерировал «рабочие элементы» в каком-то обобщенном виде.
visit(Box2DObject& object) {
Object& o = object;
visit(o);
}class IDrawingStrategy
{
public:
virtual void Draw(Object *obj) = null;
...
}void Saver::visit(Tree& tree)
{
m_document.addNode("tree");
}
void Saver::visit(Apple& apple)
{
m_document.addNode("apple");
}
void MainGameClass::saveAllObjects(std::vector<Object*> objects)
{
for (int i = 0; i < objects.size(); ++i)
{
objects[i]->accept(m_saver);
}
m_saver.saveToDisk();
}
//main.cpp
void _tmain(int argc, _TCHAR* argv[])
{
Drawer drawer; //аналог visitor
Orange orange;
orange.accept(drawer);
}
//Orange.h
class Orange
{
public:
template<class ActionState> void accept(ActionState& as);
};
//orange.cpp
template<> void Orange::accept(Drawer& as){
puts("accept drawer");
}
class Object
{
public:
virtual void draw() = 0;
};
class Orange : public Object
{
public:
virtual void draw() { puts("draw orange"); }
};
int main()
{
Object* orange = new Orange();
orange->draw();
return 0;
}
class Apple {};
class Orange {};
class Drawer
{
public:
void draw(Apple& apple);
void draw(Orange& orange);
};
int main()
{
Drawer drawer;
Apple apple;
Orange orange;
drawer.draw(apple);
drawer.draw(orange);
return 0;
}
class Human
{
public:
void eat(Apple& apple) { cout << "Yum-yum"; }
void eat(Orange& orange) { cout << "Yum-yum-yuuuum!"; }
};
class Apple
{
public:
void feed(Human& human) { human.eat(*this); }
};
class Orange
{
public:
void feed(Human& human) { human.eat(*this); }
};
int main()
{
Human human;
Apple apple;
apple.feed(human);
Orange orange;
orange.feed(human);
return 0;
}
In software engineering, double dispatch is a special form of multiple dispatch, and a mechanism that dispatches a function call to different concrete functions depending on the runtime types of two objects involved in the call.
Паттерн Visitor. Продвинутое использование