Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

PlantUML Macro
abstract class AbstractObservable {
	+void addObserver(Observer)
	+void removeObserver(Observer)
	#void fireUpdate();
 }

class ConcreteObservable {
}

AbstractObservable <|-- ConcreteObservable

interface Observer {
	void update(AbstractObservable)
}

AbstractObservable -right- "*" Observer: observers

class ConcreteObserver {
}

Observer <|.. ConcreteObserver
Code Block
languagejava
interface Observer {
	void update();
}

abstract class AbstractObservable {
	private Collection<Observer> observers = new ArrayList<Observer>();
	public void addObserver(Observer observer) {
		observers.add(observer);
	}	
	public void removeObserver(Observer observer) {
		observers.remove(observer);
	}
	protected void fireUpdate() {
		for (Observer observer: observers) {
			observer.update(this);
		}
	}
}

class ConcreteObservable extends AbstractObservable {
}

interface Observer {
	void update();
}

class ConcreteObserver implements Observer {
	public void update(AbstractObservable) {
		// method body
	}
}

Figuren lengst til venstre viser et klassediagram for Observatør-observert-teknikken. Den abstrakte klassen AbstractObservable implementerer støtte for lagring og registrering av lyttere av typen Observer vha. assosiasjonen observers og metoden addObserver og removeObserver. Den konkrete (ikke-abstrakte) observerbare klassen ConcreteObservable arver dette feltet og disse metodene fra AbstractObservable. Observer-grensesnittet fanger opp hva det vil si å observere (være en lytter), nemlig å implementere update-metode som reagerer på endringen i det observerte objektet. Den konkrete klassen ConcreteObserver implementerer dette grensesnittet og dermed også update-metoden.

Vi har her angitt synlighet(smodifikatorer) for metodene: Grønn sirkel tilsvarer public og lilla trekant tilsvarer protected (og rød firkant tilsvare private).

Den tilsvarende koden er vist til høyre. Vi ser at en heltrukken arvingspil tilsvarer extends og en stiplet arvingspil tilsvarer implements.

Merk at navnkonvensjonen i Java brukes gjerne Listener som endelse på observatør-grensesnittet og dermed også på variabler og metoder som har med den å gjøre.