Four basic elements: Abstract subject, concrete subject, Abstract observer and concrete observer.
One-to-many, so that multiple observers correspond to a theme. For example, the project manager notifies the people under his control that the job is to write code, the UI job is to draw and design, and the tester's job is to test software. Code directly:
Abstract theme
public interface Subject { void attach(Observer observer); void detach(Observer observer); void notifyObserver(); }
Abstract observer
public interface Observer { void work(); }
Specific theme (project leader)
import java.util.ArrayList; import java.util.List; public class SubjectLeader implements Subject { private List<Observer> observers = new ArrayList<>(); @Override public void attach(Observer observer) { observers.add(observer); } @Override public void detach(Observer observer) { observers.remove(observer); } @Override public void notifyObserver() { observers.forEach(observer -> observer.work()); } }
Specific observers (programmers)
public class ProgramerObserver implements Observer { @Override public void work() { System.out.println("Programmer code"); } }
Specific observer (UI)
public class UiObserver implements Observer { @Override public void work() { System.out.println("UI Draw pictures"); } }
Specific observer (test)
public class TestObserver implements Observer { @Override public void work() { System.out.println("Testing begins to test the software."); } }
Test class
public class Test { public static void main(String[] args){ Subject subjectLeader = new SubjectLeader(); Observer programer = new ProgramerObserver(); Observer ui = new UiObserver(); Observer test = new TestObserver(); subjectLeader.attach(programer); subjectLeader.attach(ui); subjectLeader.attach(test); //The leader notified everyone that work had started. subjectLeader.notifyObserver(); } }
Running results
Programmer code UI drawing. Testing begins to test the software. Process finished with exit code 0