Sunteți pe pagina 1din 5

Publisher-Subscriber Pattern

Problem Statement:

A situation often arises in which data changes in one place, but many other components depend on this data. The classical example is user interface elements: when some internal data element changes all views that depend on this data have to be updated. We could solve the problem by propagate reusable. introducing direct calling dependencies the changes, but this solution is along which and to not

inflexible

We are looking for a more

general

change-propagation

mechanism that is applicable in many contexts.


Solution:

Publisher-Subscriber Pattern One dedicated component takes the role of the publisher (called subject). All components dependent on changes in the publisher are its subscribers (called observers).

Class Model:

S ubjec t S ubjec t() run()

O bs erver1 res p : java.lang.S tring O bs erver1() update()

O bs erver2 res p : java.lang.S tring O bs erver2() update()

Use-Case Model:

S ubjec t M y app

O bs erver1

O bs erver2

Sequence Model:
: MyApp start : Subject :O bserv er1 : Observ er2

NotifyObserv ers

U pdate

Update

Activity Model:

MyApp

Subject

Observer1

Observer2

Java Implementation:
//Source file: C:\\Program Files\\Java\\jdk1.6.0_11\\bin\\Subject.java import java.util.Observable; import java.io.*; public class Subject extends Observable implements Runnable {

/** @roseuid 4AD36C46010D */


public void run() { try { BufferedReader br = new BufferedReader(new InputStreamReader( System.in )); while( true ) { String response = br.readLine(); setChanged(); notifyObservers( response ); } } catch (IOException e) { e.printStackTrace(); } } } //Source file: C:\\Program Files\\Java\\jdk1.6.0_11\\bin\\Observer1.java import java.util.Observable; import java.util.Observer; /* this is Event Handler */ public class Observer1 implements Observer { private String resp;

/** @param arg0 @param arg1 @roseuid 4AD36C4600CC */


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

//Source file: C:\\Program Files\\Java\\jdk1.6.0_11\\bin\\Observer2.java import java.util.Observable; import java.util.Observer; /* this is Event Handler */ public class Observer2 implements Observer { private String resp;

/** @param arg0 @param arg1 @roseuid 4AD36C4600ED */


public void update (Observable obj, Object arg) { if (arg instanceof String) { resp = (String) arg; System.out.println("\nReceived Response in Observer2: "+ resp ); } } } //Source file: C:\\Program Files\\Java\\jdk1.6.0_11\\bin\\MyApp.java public class MyApp {

/** @param arg0 @roseuid 4AD36C46008C

*/

public static void main(String args[]) { System.out.print("Enter Text >"); // create an event source - reads from stdin Subject sub = new Subject(); // create an observer1 Observer1 obs1 = new Observer1(); // create an observer2 Observer2 obs2 = new Observer2(); // subscribe the Observer to the Subject sub.addObserver(obs2); sub.addObserver(obs1); // starts the event thread Thread thread = new Thread(sub); thread.start(); } }

Output:

C:\Program Files\Java\jdk1.6.0_11\bin>java MyApp Enter Text >Hello Received Response in Observer1: Hello Received Response in Observer2: Hello OOMD Received Response in Observer1: OOMD Received Response in Observer2: OOMD

S-ar putea să vă placă și