Привіт усім,
Давайте розглянемо шаблон проектування Observer (Спостерігач). Шаблони проектування Observer дуже корисні при розробці масштабованих додатків або додатків з високим трафіком.
Як ви думаєте, як Amazon чи Walmart можуть відправляти сповіщення мільйонам користувачів, коли товар стає доступним? Відповідь — використання шаблону проектування Observer.
Наприкінці цієї статті ми реалізуємо простий випадок використання системи сповіщень YouTube. Давайте заглибимося в це.
Вступ
Шаблон проектування Observer використовується, коли існують відносини типу один-до-багатьох. Один із прикладів — сповіщення YouTube або будь-яка система трансляції.
У цьому шаблоні проектування є два типи сутностей: Продюсер і Спостерігач.
Продюсер — це сутність, яка надсилає сповіщення.
Спостерігач — це сутність, яка отримує сповіщення або оновлення від Продюсера.
Нижче наведена схема, яка ілюструє це:
Огляд шаблону проектування Observer
Реалізація шаблону проектування Observer
Нижче наведена діаграма класів для пояснення реалізації шаблону проектування Observer.
Діаграма класів шаблону проектування 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