Шаблон проектування “Спостерігач” | Деталізація низького рівня

Привіт усім,

Давайте розглянемо шаблон проектування Observer (Спостерігач). Шаблони проектування Observer дуже корисні при розробці масштабованих додатків або додатків з високим трафіком.

Як ви думаєте, як Amazon чи Walmart можуть відправляти сповіщення мільйонам користувачів, коли товар стає доступним? Відповідь — використання шаблону проектування Observer.

Наприкінці цієї статті ми реалізуємо простий випадок використання системи сповіщень YouTube. Давайте заглибимося в це.

Вступ

Шаблон проектування Observer використовується, коли існують відносини типу один-до-багатьох. Один із прикладів — сповіщення YouTube або будь-яка система трансляції.

У цьому шаблоні проектування є два типи сутностей: Продюсер і Спостерігач.

Продюсер — це сутність, яка надсилає сповіщення.
Спостерігач — це сутність, яка отримує сповіщення або оновлення від Продюсера.

Нижче наведена схема, яка ілюструє це:

pic

Огляд шаблону проектування Observer

Реалізація шаблону проектування Observer

Нижче наведена діаграма класів для пояснення реалізації шаблону проектування Observer.

pic

Діаграма класів шаблону проектування Observer

У наведеному вище прикладі, Продюсер має відносини типу has-a з Спостерігачем, оскільки Продюсер "має" Спостерігача (або список Спостерігачів).

Тепер давайте реалізуємо цей шаблон проектування.

IPublisher.java

package ObserverDesignPattern;  

import ObserverDesignPattern.IObserver;  

public interface IPublisher {  

 // Функція підписки  
 void subscribe(IObserver observer);  

 // Функція відписки  
 void unsubscribe(IObserver observer);  

 void notifyInform();  
}

Publisher.java

package ObserverDesignPattern;  

import ObserverDesignPattern.IObserver;  
import ObserverDesignPattern.IPublisher;  

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

public class Publisher implements IPublisher {  

 String name;  

 List observerList;  

 Publisher(String name){  
 this.name = name;  
 this.observerList = new ArrayList<>();  
 }  

 // Функція підписки  
 @Override  
 public void subscribe(IObserver observer){  
 observerList.add(observer);  
 }  

 // Функція відписки  
 @Override  
 public void unsubscribe(IObserver observer) {  
 observerList.remove(observer);  
 }  

 @Override  
 public void notifyInform(){  

 for(IObserver observer : observerList){  
 observer.inform("Whatever");  
 }  
 }  

}

IObserver.java

package ObserverDesignPattern;  
public interface IObserver {  
 void inform(String message);  
}

Observer.java

package ObserverDesignPattern;  

import ObserverDesignPattern.IObserver;  

public class Observer implements IObserver {  

 String name;  
 String email;  

 Observer(String name, String email){  
 this.name = name;  
 this.email = email;  
 }  

 @Override  
 public void inform(String message){  
 System.out.println( "name : " + this.name + " message : " + message);  
 }  
}

Main.java

package ObserverDesignPattern;  

import ObserverDesignPattern.IObserver;  
import ObserverDesignPattern.IPublisher;  

public class Main {  
 public static void main(String[] args) {  

 // Створюємо кілька паблішерів  
 IPublisher publisher1 = new Publisher("PUB1");  
 IPublisher publisher2 = new Publisher("PUB2");  

 // Створюємо кілька спостерігачів  
 IObserver observer1 = new Observer("OBS1", "EM1");  
 IObserver observer2 = new Observer("OBS2", "EM2");  

 // Підписуємо спостерігачів на паблішерів  
 publisher1.subscribe(observer1);  
 publisher1.subscribe(observer2);  

 publisher2.subscribe(observer2);  
 publisher2.subscribe(observer1);  

 // Тепер викликаємо функцію notifyInform  

 System.out.println("PUB1");  
 publisher1.notifyInform();  
 System.out.println("PUB2");  
 publisher2.notifyInform();  
 }  
}

У наведеному вище коді ми продемонстрували шаблон проектування Observer, дотримуючись принципів SOLID.

Сподіваюся, це допоможе зрозуміти концепцію. Якщо у вас є питання або сумніви, не соромтесь коментувати.

Також я відкритий до пропозицій щодо поліпшення. Повідомте мене в коментарях, якщо є які-небудь.

Перекладено з: Observer Design Pattern | Low Level Design

Leave a Reply

Your email address will not be published. Required fields are marked *