import javax.swing.*; import java.util.*; class Subject { private ArrayList observers = new ArrayList(); public void attach( Observer o ) { observers.add(o); //καταχώρηση παρατηρητή } public void detach( Observer o) { observers.remove( o ); } public void Notify() { for (int i=0; i < observers.size(); i++) ((Observer)observers.get(i)).update(); //ανακοίνωση αλλαγών στους παρατηρητές } } class Timer extends Subject { private int state; public int getState() { return state; } public void setState( int in ) { state = in; Notify(); } } abstract class Observer { public abstract void update(); } class HexObserver extends Observer { private Timer subj; public HexObserver( Timer s ) { subj = s; subj.attach( this ); //Οι παρατηρητές καταχωρούν τον εαυτό τους } public void update() { System.out.print( " " + Integer.toHexString( subj.getState() ) ); } //Οι παρατηρητές αντλούν πληροφορία } class OctObserver extends Observer { private Timer subj; public OctObserver( Timer s ) { subj = s; subj.attach( this ); //Οι παρατηρητές καταχωρούν τον εαυτό τους } public void update() { System.out.print( " " + Integer.toOctalString( subj.getState() ) ); } //Οι παρατηρητές αντλούν πληροφορία } class BinObserver extends Observer { private Timer subj; public BinObserver( Timer s ) { subj = s; subj.attach( this ); //Οι παρατηρητές καταχωρούν τον εαυτό τους } public void update() { System.out.print( " " + Integer.toBinaryString( subj.getState() ) ); } //Οι παρατηρητές αντλούν πληροφορία } public class ObserverDemo { public static void main( String[] args ) { Timer timerSubject = new Timer(); new HexObserver( timerSubject ); new OctObserver( timerSubject ); BinObserver binObs = new BinObserver( timerSubject ); for(int i=0; i<2; i++) { System.out.print( "\nEnter a number: " ); String text = JOptionPane.showInputDialog(null, "Current time? (integer)"); int n = Integer.parseInt(text); timerSubject.setState(n); } //Detaching one observer timerSubject.detach(binObs); System.out.println(); System.out.println("BinObserver Detached from Timer"); for(int i=0; i<2; i++) { System.out.print( "\nEnter a number: " ); String text = JOptionPane.showInputDialog(null, "Current time? (integer)"); int n = Integer.parseInt(text); timerSubject.setState(n); } } }