سلام. برای این مورد، الگوی Observer (مشاهده کننده) یا Publish/Subscribe (انتشار/اشتراک) میتواند مناسب باشد. در این الگو، کلاس A (Publisher) وقتی نتیجهای آماده میشود، یک رویداد ایجاد میکند و کلاس B (Subscriber) به این رویداد واکنش نشان میدهد. کلاس A نیازی به دانستن جزئیات کلاس B ندارد.
برای پیادهسازی این الگو در C++، میتوانید از مفهوم Pointers to member function استفاده کنید. در زیر یک نمونه کد ساده ارائه شده است:
`
#include <iostream>
#include <functional>
#include <vector>
class A {
public:
void addListener(const std::function<void(int)>& listener) {
listeners.push_back(listener);
}
void computeResult() {
int result = 10; // Suppose this is the computed result
for (const auto& listener : listeners) {
listener(result);
}
}
private:
std::vector<std::function<void(int)>> listeners;
};
class B {
public:
void onResultReady(int result) {
std::cout << "Received result: " << result << std::endl;
}
};
int main() {
A a;
B b;
a.addListener([&b](int result) { b.onResultReady(result); });
a.computeResult();
return 0;
}
در این کد، کلاس A یک لیست از توابع listener دارد که هرگاه نتیجهای آماده شود، این توابع فراخوانی میشوند. کلاس B تابع `onResultReady` را دارد که به عنوان یکی از این listenerها به کلاس A اضافه میشود. هنگامی که `computeResult` در کلاس A فراخوانی میشود، تابع `onResultReady` در کلاس B نیز فراخوانی میشود و نتیجه را دریافت میکند.
در C++ یک الگوی (Pattern) وجود دارد که میتوانید برای این کار استفاده کنید. این الگو به نام **Observer Pattern** نامیده میشود.این روش خیلی رایج تر از مثال بالاست.
الگوی Observer یک الگوی طراحی نرمافزار است که به شیها اجازه میدهد تا به شیهای دیگر مشترک شوند و در صورت تغییر وضعیت آن شیها، اعلانهایی بگیرند. در مورد شما، کلاس A موضوع (subject) و کلاس B مشاهدهگر (observer) خواهد بود.
اینجا چگونگی پیادهسازی الگوی Observer را در C++ مشاهده میکنید:
class Subject {
public:
void NotifyObservers() {
for (auto observer : observers) {
observer->OnNotify();
}
}
void AddObserver(Observer* observer) {
observers.push_back(observer);
}
private:
std::vector<Observer*> observers;
};
class Observer {
public:
virtual void OnNotify() = 0;
};
class ConcreteObserver : public Observer {
public:
void OnNotify() override {
// Do something with the notification.
}
};
int main() {
Subject subject;
ConcreteObserver observer;
subject.AddObserver(&observer);
subject.NotifyObservers();
}
در این مثال، وقتی متد `NotifyObservers()` روی شیء `Subject` فراخوانی میشود، آن شیء از لیست مشاهدهگران عبور میکند و متد `OnNotify()` را روی هرکدام از آنها فراخوانی میکند. سپس متد `OnNotify()` در کلاس `ConcreteObserver` عملیاتی را با اعلان انجام میدهد.
الگوی Observer یک الگوی قدرتمند است که میتواند به منظور جداسازی شیءها و اجازه دادن به آنها برای ارتباط با یکدیگر بدون دانستن وجود یکدیگر استفاده شود.