Tôi đang làm việc với thư viện bên ngoài và cần tạo mẫu quan sát nơi quan sát được bắt nguồn từ một đối tượng thuộc về thư viện. Tôi không muốn thay đổi lớp cơ sở từ thư viện và đồng thời tôi phải sử dụng danh sách các tham chiếu/con trỏ tới lớp cơ sở không thay đổi này. Ngày đầu này thư viện xây dựng danh sách các đối tượng mà từ đó tôi cần phải sàng lọc những người phù hợp để được quan sát viên.Sử dụng RTTI với các đối tượng có nguồn gốc từ thư viện bên ngoài
Mã tôi đã viết là tương đương với điều này:
#include <iostream>
#include <vector>
#include <memory>
// This class is from an external library which I don't want to chagne
class BaseFromLibrary {
public:
virtual ~BaseFromLibrary() {}
};
class BaseOfObserver {
public:
void notify() { std::cout << "What-ho!\n"; };
};
class Observer : public BaseFromLibrary, public BaseOfObserver {};
class Subject {
public:
std::vector<std::shared_ptr<Observer>> observers;
void notifyObervers() {
for (auto &o : observers)
(*o).notify();
}
};
int main() {
// This list is constructed by the library and I cannot interfere with that
// process
std::vector<std::shared_ptr<BaseFromLibrary>> list{
std::make_shared<BaseFromLibrary>(), std::make_shared<Observer>()};
Subject s;
for (auto &e : list)
if (std::dynamic_pointer_cast<Observer>(e) != nullptr)
s.observers.push_back(std::dynamic_pointer_cast<Observer>(e));
s.notifyObervers();
}
Sau đó, tôi sử dụng BaseOfObserver
thêm "nhận thức chủ đề" với các loại có nguồn gốc khác của tôi. Bằng cách này tôi không phải lặp lại câu lệnh if cho từng người quan sát cụ thể mà tôi muốn thực hiện.
Dường như hoạt động tốt, nhưng đó có phải là lỗi thiết kế không? Có cách nào tốt hơn để xây dựng danh sách người quan sát mà không có cơ chế RTTI và không can thiệp vào các lớp thư viện không?
Nếu tôi hiểu chính xác bạn, bạn đang đề nghị chia 'danh sách' khỏi ví dụ của tôi. Tôi có thể quên nhấn mạnh rằng đây cũng là điều tôi không thể làm. Thư viện xây dựng danh sách đó một mình và tôi không muốn can thiệp vào quá trình đó. Tôi sẽ cố gắng chỉnh sửa điều đó. Điểm bị rò rỉ bộ nhớ. –