لمعانٍ أخرى، طالع المراقب (توضيح).
نموذج **المراقب** (بالإنجليزية: Observer Pattern)‏ هو أحد نماذج التصميم التي يدير فيها كائن يدعى باسم الهدف (بالإنجليزية: Subject)‏ قائمة من الكائنات الأخرى التي تعتمد عليه وتسمى هذه الكائنات بالمراقبين (بالإنجليزية: Observers)‏، حيث يقوم بتنبيه هذه الكائنات عند حدوث تغيير في حالته والذي عادةً ما يحصل لدى استدعاء أحد الطرق الخاصة به. يستخدم هذا النموذج بشكل رئيسي في تحقيق أنظمة التحكم بالأحداث الموزعة. كما يعتبر مكوناً رئيسياً من نموذج التصميم المعماري نمط-عرض-متحكم (MVC). وقد استُخدم هذا النموذج لأول مرة في تصميم بيئة تطوير واجهة المستخدم المبنية على MVC والخاصة بلغة سمول توك. يستخدم نموذج المراقب بشكل واسع في العديد من المكتبات والنظم البرمجية بما في ذلك معظم أدوات تطوير واجهة المستخدم المرئية.

قد يسبب استخدام نموذج المراقب حدوث تسريب في الذاكرة وتعرف هذه المشكلة باسم المستمع المختفي (بالإنجليزية: Lapsed Listener)‏، يحدث ذلك بسبب الحاجة إلى تسجيل وإلغاء تسجيل المراقب بشكل صريح، وبما أن الهدف سيبقي مراجعاً قوية إلى قائمة مراقبيه فإنه سيمنع بذلك تدميرهم على سبيل المثال من قبل جامع القمامة. يمكن حل هذه المشكلة عبر جعل الهدف يمتلك مراجعاً ضعيفة إلى مراقبيه.

مكونات النموذج
--------------

مخطط صفوف نموذج المراقب

مثال
----

فيما يلي مثال بلغة جافا يوضح كيفية استخدام نموذج المراقب، في هذا المثال تم قراءة الدخل من لوحة المفاتيح ومعالجة كل سطر كحدث. يستخدم هذا المثال الصفوف `java.util.Observer` و`java.util.Observable`. عند إدخال سلسلة محرفية عن طريق `System.in` تُستدعى الطريقة `notifyObservers` من أجل تنبيه كافة المراقبين إلى حدوث الحدث وذلك عن طريق استدعاء الطرق `update` الخاصة بهم.

يتضمن الملف `MyApp.java` الطريقة `main` التي تستخدم لتشغيل الكود.

```
/\* EventSource.java : اسم الملف \*/
package org.wikipedia.obs;

import java.util.Observable; //تضمين مكتبة المراقب
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class EventSource extends Observable implements Runnable {
 @Override
 public void run() {
 try {
 final InputStreamReader isr = new InputStreamReader(System.in);
 final BufferedReader br = new BufferedReader(isr);
 while (true) {
 String response = br.readLine();
 setChanged();
 notifyObservers(response);
 }
 }
 catch (IOException e) {
 e.printStackTrace();
 }
 }
}

```

```
/\* ResponseHandler.java : اسم الملف \*/

package org.wikipedia.obs;

import java.util.Observable;
import java.util.Observer; /\* هذا هو معالج الأحداث \*/

public class ResponseHandler implements Observer {
 private String resp;
 public void update(Observable obj, Object arg) {
 if (arg instanceof String) {
 resp = (String) arg;
 System.out.println("\nReceived Response: "+ resp );
 }
 }
}

```

```
/\* MyApp.java : اسم الملف \*/
/\* البرنامج الرئيسي هنا \*/

package org.wikipedia.obs;

public class MyApp {
 public static void main(String[] args) {
 System.out.println("Enter Text >");

 // مصدر الأحداث - قراءة الدخل من مجرى الدخل الرئيسي
 final EventSource eventSource = new EventSource();

 // أنشئ مراقب
 final ResponseHandler responseHandler = new ResponseHandler();

 // سجل المراقب في قائمة مراقبي الأحداث
 eventSource.addObserver(responseHandler);

 // شغل خيط مصدر الأحداث
 Thread thread = new Thread(eventSource);
 thread.start();
 }
}

```

وهذا مثال آخر بلغة بايثون:

```
class Observable(object):
  def \_\_init\_\_(self):
    self.\_\_observers = []
  def registerObserver(self, observer):
    self.\_\_observers.append(observer)
  def notifyObservers(self, \*args, \*\*kwargs):
    for observer in self.\_\_observers:
      observer.notify(self, \*args, \*\*kwargs)

class Observer(object):
  def \_\_init\_\_(self, observable):
    observable.registerObserver(self)
  def notify(self, observable, \*args, \*\*kwargs):
    print 'Got', args, kwargs, 'From', observable

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

```

انظر أيضاً
----------

* نماذج التصميم
* نمط-عرض-متحكم

مراجع
-----

1. ↑  "The Observer design pattern - Problem, Solution, and Applicability". *w3sDesign.com*. مؤرشف من الأصل في 2018-05-16. اطلع عليه بتاريخ 2017-08-12.
2. ↑  "The Observer design pattern - Structure and Collaboration". *w3sDesign.com*. مؤرشف من الأصل في 2017-08-21. اطلع عليه بتاريخ 2017-08-12.
3. ↑  Comparison between different observer pattern implementations Moshe Bindler, 2015 (Github) نسخة محفوظة 02 مارس 2017 على موقع واي باك مشين.

* أيقونة بوابةبوابة علم الحاسوب
* أيقونة بوابةبوابة تقانة المعلومات

|  |  |
| --- | --- |
| مشاريع شقيقة | في كومنز صور وملفات عن: المراقب |



| * ع
* ن
* ت
 أنماط تصميم البرمجيات (برمجة) |
| --- |
| إنشائي (Creational) | 
* Abstract factory
* نمط تصميم الباني
* حقن التبعية
* نمط طريقة المصنع
* Lazy initialization
* Multiton
* Object pool
* Prototype
* اكتساب الموارد تهيئة
* النمط المفرد

 |
| هيكلي (Structural) | 
* نمط المحول
* نموذج التصميم جسر
* نموذج التصميم المجمع
* نموذج التصميم ديكور
* Delegation
* نمط واجهة المبنى
* نموذج التصميم وزن الذبابة
* Front controller
* Marker interface
* Module
* نمط الوكيل
* Twin

 |
| سلوكي (Behavioral) | 
* Blackboard
* Chain of responsibility
* Command
* Interpreter
* نمط المكرر
* Mediator
* Memento
* Null object
* المراقب (نموذج تصميم)
* Servant
* Specification
* State
* نموذج الإستراتيجية
* Template method
* Visitor

 |
| وظيفي (Functional) | 
* مونويد
* Functor
* Applicative
* Monad
* Comonad
* Free monad
* HOF
* Currying
* Function composition
* Closure
* المولد

 |
| متزامن (Concurrency) | 
* Active object
* Actor
* Balking
* حاجز (حوسبة)
* Binding properties
* Coroutine
* Compute kernel
* Double-checked locking
* Event-based asynchronous
* ليف
* Futex
* Futures and promises
* Guarded suspension
* Immutable object
* Join
* Lock
* صيغة التراسل
* Monitor
* Nuclear
* Proactor
* Reactor
* Read write lock
* Scheduler
* STM
* Thread pool
* Thread-local storage

 |
| معماري (Architectural) | 
* \* ADR
* نمط التسجيل النشط
* نمط الوسيط
* نموذج الخادم والعميل
* هندسة البرمجيات بالمكونات
* DAO
* كائن نقل البيانات
* تصميم موجه بالمجال
* ECB
* ECS
* EDA
* Front controller
* Identity map
* Interceptor
* Implicit invocation
* عكس التحكم
* Model 2
* MOM
* Microservices
* MVA
* نمط وعرض ومتحكم
* MVP
* MVVM
* Monolithic
* عمارة متعددة الطبقات
* Naked objects
* ORB
* ند لند
* Publish–subscribe
* PAC
* رست
* بنية خدمية
* نمط محدد موقع الخدمة
* SN
* SBA
* Specification

 |
| توزيع سحابي (Cloud Distributed) | 
* Ambassador
* Anti-Corruption Layer
* Bulkhead
* Cache-Aside
* Circuit Breaker
* CQRS
* Compensating Transaction
* Competing Consumers
* Compute Resource Consolidation
* Event Sourcing
* External Configuration Store
* Federated Identity
* Gatekeeper
* فهرس قاعدة بيانات
* Leader Election
* نموذج الهيكلة والتجميع
* Materialized View
* Pipes
* Filters
* Priority Queue
* Publisher-Subscriber
* Queue-Based Load Leveling
* Retry
* Scheduler Agent Supervisor
* Sharding
* Sidecar
* Strangler
* Throttling
* Valet Key

 |
| أخرى | 
* Business delegate
* Composite entity
* Intercepting filter
* Lazy loading
* Mangler
* غرض مقلد
* Type tunnel
* Method chaining

 |
| كتب | 
* *خطط التصميم*
* *Enterprise Integration Patterns*
* *Code Complete*
* *POSA*

 |
| أشخاص | 
* كريستوفر الكسندر
* إريك جاما
* رالف جونسن
* John Vlissides
* Grady Booch
* كينت بيك
* وورد كانينغهام
* مارتن فاولر
* روبرت سيسيل مارتن
* Jim Coplien
* دوغلاس س. شميت
* Linda Rising

 |
| مجتمعات (Communities) | 
* The Hillside Group
* The Portland Pattern Repository

 |