Dobre praktyki wzorca projektowego OBSERWATOR

0

Pierwsze pytanie: po co używać do tego interfejsu Javowego, skoro można to samemu łatwo napisać?

Drugie pytanie: jak użyć javowych interfejsów do zainstalowania obserwatora?

Zrobiłem tak:


// klasa abstrakcyjna obserwatora --------------------------------------------------
public abstract class Obserwator {

	public abstract void update();

}

// obserwator -------------------------------------------------------------------------------
public class ObserwatorKrzysio extends Obserwator {

	@Override
	public void update() {
		System.out.println("Zaktualizowano magazyn, biegnij do sklepu Krzysiu");
	}

}


// jedziemy z koksem -----------------------------------------------------------------
import java.util.ArrayList;
import java.util.List;

public class Magazyn {
	private int ilosc;
	private List<Obserwator> obserwatorzy = new ArrayList<>();

	public int getIlosc() {
		return ilosc;
	}

	public void setIlosc(int x) {
		ilosc = x;
		powiadomObserwatorow();
	}

	public void dodajObserwatora(Obserwator obs) {
		obserwatorzy.add(obs);
	}

	public void powiadomObserwatorow() {
		for (Obserwator obs : obserwatorzy) {
			obs.update();
		}
	}

	public static void main(String args[]) {

		Magazyn m = new Magazyn();
		ObserwatorKrzysio krzys = new ObserwatorKrzysio();

		// bez obserwatorow
		m.setIlosc(100);

		// z obserwatorem
		m.dodajObserwatora(krzys);
		m.setIlosc(200);
	}
}

2

Zakładam, że chodzi Ci tu o Javowe Observable i Observer. W sumie to odpowiedź na pytanie "po co używać gotowych skoro można napisać samemu" sprowadzałoby się do pisania samemu wszystkiego od początku. Po co używać LinkedList skoro można napisać samemu?

Właśnie po to, żeby użyć czyjejś pracy i dojść szybciej do rozwiązania. Poza tym kod w SDK jest dużo lepiej przetestowany, masz pewność, że jest w nim mniej bugów (jeśli jakiekolwiek są) niż w kodzie, który Ty napiszesz.

class MyObserver implements Observer {
    public void update(Observable observable, Object event) {
        // zrob cos z event,
    }
}

class Main {
    public static class MyEvent {
         // szczegoly zdarzenia
    }
    public static void main(String... args) {
        Observable observable = new Observable();
        observable.addObserver(new MyObserver());
        // zrob cos sensownego
        observable.notifyObservers(new MyEvent());
    }
} 

1 użytkowników online, w tym zalogowanych: 0, gości: 1