Item
클래스 의 계층 구조가 있다고 가정 해 봅시다 Rectangle, Circle, Triangle
. 나는 그것들을 그릴 수 있기를 원하므로 첫 번째 가능성은 Draw()
각각에 가상 방법을 추가하는 것입니다 .
class Item {
public:
virtual ~Item();
virtual void Draw() =0;
};
그러나 Core 라이브러리에는 기본 표현 만 포함되어 있지만 그리기 기능을 별도의 Draw 라이브러리로 분할하고 싶습니다. 내가 생각할 수있는 몇 가지 가능성이 있습니다.
1- DrawManager
의 목록을 가져 와서 수행 할 작업을 해결하기 Item
위해 사용해야 하는 A dynamic_cast<>
:
class DrawManager {
void draw(ItemList& items) {
FOREACH(Item* item, items) {
if (dynamic_cast<Rectangle*>(item)) {
drawRectangle();
} else if (dynamic_cast<Circle*>(item)) {
drawCircle();
} ....
}
}
};
이것은 RTTI에 의존하고 한 클래스가 계층 구조의 모든 항목을 인식하도록 강요하기 때문에 이상적이지 않습니다.
2-다른 접근 방식은 도면 책임을 ItemDrawer
계층 구조 ( RectangleDrawer
) 등에 지연시키는 것입니다 .
class Item {
virtual Drawer* GetDrawer() =0;
}
class Rectangle : public Item {
public:
virtual Drawer* GetDrawer() {return new RectangleDrawer(this); }
}
이것은 아이템의 기본 표현과 드로잉 코드 사이의 관심사 분리를 달성합니다. 문제는 Item 클래스가 드로잉 클래스에 의존한다는 것입니다.
이 도면 코드를 별도의 라이브러리로 분리하려면 어떻게해야합니까? 항목에 대한 솔루션이 설명의 팩토리 클래스를 리턴합니까? 그러나 Core 라이브러리가 Draw 라이브러리에 종속되지 않도록 어떻게 정의 할 수 있습니까?