الگوی ناظر

از ویکی‌پدیا، دانشنامهٔ آزاد

الگوی ناظر یک الگوی طراحی نرم‌افزار است که در آن یک شی به نام موضوع، فهرست وابستگی‌هایش را با نام ناظران نگه می‌دارد و هرگونه تغییر در وضعیتش را به‌طور خودکار و معمولاً با صدا کردن یکی از روش‌های آن به اطلاع آن اشیا می‌رساند.

این الگو معمولاً برای پیاده‌سازی سامانه‌های توزیع‌شدهٔ رسیدگی به رویداد در نرم‌افزارهای «رویداد محور» استفاده می‌شود. اکثر زبان‌های مدرن مانند C# سازندگان درونی‌شده «رویداد» را دارند که الگوی ناظر را پیاده‌سازی می‌کند تا برنامه‌نویسی آسان و کد کوتاه شود.

الگوی ناظر همچنین بخش مهمی در الگوی معماری مدل-نما-کنترل‌گر (MVC) دارد.[۱] الگوی ناظر در بسیاری از کتابخانه‌های و سامانه‌های برنامه‌نویسی و تقریباً تمام تول‌کیت‌های GUI پیاده‌سازی شده‌است.

دیاگرام کلاس

UML class diagram ناظر الگوی

مثال

مثال در پایتون:

class Observable:
    def __init__(self):
        self.__observers = []

    def register_observer(self, observer):
        self.__observers.append(observer)

    def notify_observers(self, *args, **kwargs):
        for observer in self.__observers:
            observer.notify(self, *args, **kwargs)

class Observer:
    def __init__(self, observable):
        observable.register_observer(self)

    def notify(self, observable, *args, **kwargs):
        print('Got', args, kwargs, 'From', observable)

subject = Observable()
observer = Observer(subject)
subject.notify_observers('test')


مثال در جاوا:

import java.util.List;
import java.util.ArrayList;
import java.util.Scanner;

class EventSource {
    public interface Observer {
        void update(String event);
    }
  
    private final List<Observer> observers = new ArrayList<>();
  
    private void notifyObservers(String event) {
        observers.forEach(observer -> observer.update(event)); //alternative lambda expression: observers.forEach(Observer::update);
    }
  
    public void addObserver(Observer observer) {
        observers.add(observer);
    }
  
    public void scanSystemIn() {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNextLine()) {
            String line = scanner.nextLine();
            notifyObservers(line);
        }
    }
}
public class ObserverDemo {
    public static void main(String[] args) {
        System.out.println("Enter Text: ");
        EventSource eventSource = new EventSource();
        
        eventSource.addObserver(event -> {
            System.out.println("Received response: " + event);
        });

        eventSource.scanSystemIn();
    }
}

جستارهای وابسته

منابع

  1. "Model-View-Controller". MSDN. Retrieved 2015-04-21.