Katakanlah saya memiliki hirarki dari Item
kelas: Rectangle, Circle, Triangle
. Saya ingin dapat menggambar mereka, jadi kemungkinan pertama saya adalah menambahkan Draw()
metode virtual untuk masing-masing:
class Item {
public:
virtual ~Item();
virtual void Draw() =0;
};
Namun, saya ingin membagi fungsionalitas menggambar ke pustaka Draw yang terpisah sementara Core library hanya berisi representasi dasar. Ada beberapa kemungkinan yang dapat saya pikirkan:
1 - A DrawManager
yang mengambil daftar Item
s dan harus digunakan dynamic_cast<>
untuk mengetahui apa yang harus dilakukan:
class DrawManager {
void draw(ItemList& items) {
FOREACH(Item* item, items) {
if (dynamic_cast<Rectangle*>(item)) {
drawRectangle();
} else if (dynamic_cast<Circle*>(item)) {
drawCircle();
} ....
}
}
};
Ini tidak ideal karena bergantung pada RTTI dan memaksa satu kelas untuk mengetahui semua item dalam hierarki.
2 - Pendekatan lain adalah menunda menarik tanggung jawab ke ItemDrawer
hierarki ( RectangleDrawer
, dll):
class Item {
virtual Drawer* GetDrawer() =0;
}
class Rectangle : public Item {
public:
virtual Drawer* GetDrawer() {return new RectangleDrawer(this); }
}
Ini mencapai pemisahan kekhawatiran antara representasi dasar dari Item dan kode untuk menggambar. Masalahnya adalah bahwa kelas Item tergantung pada kelas menggambar.
Bagaimana saya bisa memisahkan kode gambar ini menjadi perpustakaan yang terpisah? Apakah solusi untuk Item mengembalikan kelas deskripsi dari pabrik? Namun, bagaimana ini dapat didefinisikan sehingga perpustakaan inti tidak bergantung pada perpustakaan undian?