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

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

در این الگوی اشیای ناظر (observer) نزد اشیای subject ثبت‌نام (register) می‌کنند. در ادامه شئ subject پس از هر تغییر تمام observer ها خود را مطلع می‌کند.

الگوی ناظر همچنین بخش مهمی در الگوی معماری مدل-نما-کنترل‌گر (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.

| * ن
* ب
* و
الگوهای طراحی |
| --- |
| الگوهای طراحی GO4 | 

|  |  |
| --- | --- |
| ایجاد | 
* الگوی کارخانه انتزاعی
* الگوی سازنده
* الگوی متد کارخانه شیء
* الگوی نمونه اولیه
* الگوی یگانه

 |
| ساختاری | 
* آداپتور
* پل
* کامپوزیت
* آذینگر
* نما
* مگس وزن
* وکالت

 |
| رفتاری | 
* زنجیره مسئولیت
* الگوی فرمان
* مفسر
* الگوی تکرار
* میانجی
* یادگاری
* ناظر
* وضعیت
* استراتژی
* متد الگو
* بازدیدگر

 |

 |
| Concurrencypatterns | 
* Active object
* Balking
* Binding properties
* Double-checked locking
* Event-based asynchronous
* Guarded suspension
* Join
* قفل
* مانیتور
* Proactor
* Reactor
* Read write lock
* زمان‌بندی
* الگوی مخزن نخ
* Thread-local storage

 |
| الگوهایمعماری | 
* Front controller
* مفسر
* مدل-نما-کنترل‌گر
* ADR
* Entity-component-system
* چندلایه
* Specification
* Publish–subscribe
* اشیای لخت
* Service locator
* ثبت کنشور
* Identity map
* شی دسترسی به داده
* شی انتقال داده
* وارونگی کنترل
* Model 2

 |
| دیگرالگوها | 
* Blackboard
* Business delegate
* Composite entity
* تزریق نیازمندی
* Intercepting filter
* بارگیری تنبلانه
* شیء ساختگی
* Null object
* استخر اشیاء
* Servant
* Twin
* Type tunnel
* Method chaining

 |
| کتاب‌ها | 
* *الگوهای طراحی*
* *Enterprise Integration Patterns*
* *Patterns of Enterprise Application Architecture*
* *Analysis patterns*

 |
| افراد | 
* کریستوفر الکساندر
* Erich Gamma
* Ralph Johnson
* John Vlissides
* گریدی بوچ
* کنت بک
* وارد کانینگهام
* مارتین فولر
* رابرت سسیل مارتین
* Jim Coplien
* Douglas Schmidt
* Linda Rising

 |
| جوامع | 
* The Hillside Group
* The Portland Pattern Repository

 |