Observer Pattern is design Pattern which describes one to many relationship, which helps in publisher-subscriber model, where one publisher can notify to multiple subscribers.
Usually one or more subscriber classes will be there for this pattern, and these classes will be notified based on the publisher notification change.
Java Swing listeners are part of an Observer design pattern implementation.
As listener is an implementation of Observer Pattern, as it is triggered by an event.
Below is a simple example of multiple RSSFeed Subscribers and a single RSS Feed News Publisher. (Using Observer & Observable Pattern already present in Java)
The publisher publishes news like entertainment, political & sports news one by one, and the RSSFeed subscribers(observers) are getting their news changed., accordingly.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
package my.tutorial.flow; import java.util.ArrayList; import java.util.List; import java.util.Observable; import java.util.Observer; /** * Observer Pattern Example - using single RSSFeed Source & Multiple Receivers.. * @author Karthick - https://tutorialflow.com * */ public class ObserverPatternRSSFeedExample { public static void main(String[] args) { RSSFeedObserver observerOne = new RSSFeedObserver("RSSFeed ObserverOne"); RSSFeedObserver observerTwo = new RSSFeedObserver("RSSFeed ObserverTwo"); RSSFeedObserver observerThree = new RSSFeedObserver("RSSFeed ObserverThree"); RSSFeedObserver observerFour = new RSSFeedObserver("RSSFeed ObserverFour"); RSSFeedSource rssFeedSource = new RSSFeedSource(); rssFeedSource.addObserver(observerOne); rssFeedSource.addObserver(observerTwo); rssFeedSource.addObserver(observerThree); rssFeedSource.addObserver(observerFour); System.out.println("*******************************"); System.out.println("Going to send Entertainment News"); rssFeedSource.addNewMessage("This is Entertainment News"); System.out.println("*******************************"); System.out.println("Going to send Political News"); rssFeedSource.addNewMessage("This is Political News"); System.out.println("*******************************"); System.out.println("Going to send Sports News"); rssFeedSource.addNewMessage("This is Sports News"); System.out.println("*******************************"); } } class RSSFeedObserver implements Observer { private String observerName; public RSSFeedObserver(String name) { this.observerName = name; } public String getObserverName() {return this.observerName;} @Override public void update(Observable rssFeedSource, Object news) { System.out.println("ObserverName: " + getObserverName()); System.out.print("Total News->" ); System.out.println(((RSSFeedSource)rssFeedSource).getAllNews()); System.out.println("Recent News"); System.out.println(news); } } class RSSFeedSource extends Observable { List<String> totalNews = new ArrayList<String>(); public void addNewMessage(String news) { totalNews.add(news); setChanged(); notifyObservers(news); } public String getAllNews() { return totalNews.toString(); } } |
Output:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
******************************* Going to send Entertainment News ObserverName: RSSFeed ObserverFour Total News->[This is Entertainment News] Recent News This is Entertainment News ObserverName: RSSFeed ObserverThree Total News->[This is Entertainment News] Recent News This is Entertainment News ObserverName: RSSFeed ObserverTwo Total News->[This is Entertainment News] Recent News This is Entertainment News ObserverName: RSSFeed ObserverOne Total News->[This is Entertainment News] Recent News This is Entertainment News ******************************* Going to send Political News ObserverName: RSSFeed ObserverFour Total News->[This is Entertainment News, This is Political News] Recent News This is Political News ObserverName: RSSFeed ObserverThree Total News->[This is Entertainment News, This is Political News] Recent News This is Political News ObserverName: RSSFeed ObserverTwo Total News->[This is Entertainment News, This is Political News] Recent News This is Political News ObserverName: RSSFeed ObserverOne Total News->[This is Entertainment News, This is Political News] Recent News This is Political News ******************************* Going to send Sports News ObserverName: RSSFeed ObserverFour Total News->[This is Entertainment News, This is Political News, This is Sports News] Recent News This is Sports News ObserverName: RSSFeed ObserverThree Total News->[This is Entertainment News, This is Political News, This is Sports News] Recent News This is Sports News ObserverName: RSSFeed ObserverTwo Total News->[This is Entertainment News, This is Political News, This is Sports News] Recent News This is Sports News ObserverName: RSSFeed ObserverOne Total News->[This is Entertainment News, This is Political News, This is Sports News] Recent News This is Sports News ******************************* |