الگوی طراحی برای ارسال پیام - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

الگوی طراحی برای ارسال پیام

0 امتیاز
سلام.دنبال یک الگوی می گردم در c++ شما فرض کنید دو کلاس A,B داریم قراره زمانیکه در کلاس A نتیجه آماده شد کلاس B این نتیجه را دریافت کنه در ضمن کلاس A از وجود کلاس B خبر نداره.
سوال شده اردیبهشت 29, 1402  بوسیله ی zirak (امتیاز 473)   3 28 52

1 پاسخ

+1 امتیاز
 
بهترین پاسخ
سلام. برای این مورد، الگوی 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 یک الگوی قدرتمند است که می‌تواند به منظور جداسازی شیء‌ها و اجازه دادن به آن‌ها برای ارتباط با یکدیگر بدون دانستن وجود یکدیگر استفاده شود.

 

پاسخ داده شده تیر 2, 1402 بوسیله ی farnoosh (امتیاز 8,362)   20 44 59
انتخاب شد شهریور 2, 1402 بوسیله ی zirak
...