Digamos que eu tenho uma hierarquia de Item
classes: Rectangle, Circle, Triangle
. Quero poder desenhá-los, então minha primeira possibilidade é adicionar um Draw()
método virtual a cada um:
class Item {
public:
virtual ~Item();
virtual void Draw() =0;
};
No entanto, desejo dividir a funcionalidade de desenho em uma biblioteca Draw separada, enquanto a biblioteca Core contém apenas as representações básicas. Há algumas possibilidades em que posso pensar:
1 - A DrawManager
que pega uma lista de se Item
precisa usar dynamic_cast<>
para descobrir o que fazer:
class DrawManager {
void draw(ItemList& items) {
FOREACH(Item* item, items) {
if (dynamic_cast<Rectangle*>(item)) {
drawRectangle();
} else if (dynamic_cast<Circle*>(item)) {
drawCircle();
} ....
}
}
};
Isso não é ideal, pois depende do RTTI e força uma classe a estar ciente de todos os itens na hierarquia.
2 - A outra abordagem é adiar a atribuição de responsabilidades a uma ItemDrawer
hierarquia ( RectangleDrawer
, etc):
class Item {
virtual Drawer* GetDrawer() =0;
}
class Rectangle : public Item {
public:
virtual Drawer* GetDrawer() {return new RectangleDrawer(this); }
}
Isso alcança a separação de preocupações entre a representação básica dos itens e o código para o desenho. O problema, porém, é que as classes de itens dependem das classes de desenho.
Como posso separar esse código de desenho em uma biblioteca separada? A solução para os Itens retornar uma classe de fábrica com alguma descrição? No entanto, como isso pode ser definido para que a biblioteca Core não dependa da biblioteca Draw?