Описание:
Паттрен Наблюдатель необходим для создания слабосвязанного взаимодействия субъекта (самолет, космический корабль и другие субъекты, имеющие состояние) с наблюдателями (монитор, чёрный ящик или другой объект, использующий информацию о субъекте по-своему). Паттерн Наблюдатель реализует отношение “один ко многим”.
Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public class Main { public static void main(String[] args){ SpaceShipData spaceShipData = new SpaceShipData(); SpaceDisplay spaceDisplay = new SpaceDisplay(spaceShipData); spaceShipData.setParameters(0,SpaceShipData.SHIELD_ON,new int[]{0,0,0}); spaceShipData.setParameters(100,SpaceShipData.SHIELD_OFF, new int[]{1000,300,100}); spaceDisplay.unSubscribe(); spaceShipData.setParameters(100000,SpaceShipData.SHIELD_ON, new int[]{500000,780,123}); } } |
1 2 3 4 5 6 |
Current velocity: 0 Coordinates: X=0 Y=0 Z=0 Shield status: 0 Current velocity: 100 Coordinates: X=1000 Y=300 Z=100 Shield status: 1 |
Коды классов:
1 2 3 4 5 6 |
public interface Observable { List<observer> observers = new ArrayList<observer>(); public void notifyObservers(); public void addObserver(Observer o); public void removeObserver(Observer o); } |
1 2 3 |
public interface Observer { public void update(Object o); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
public class SpaceShipData implements Observable { public static int SHIELD_ON = 0; public static int SHIELD_OFF = 1; int currentVelocity; int shieldStatus = SHIELD_ON; int[] coords = new int[3]; public void setParameters(int velocity, int shield, int[] coords){ this.currentVelocity = velocity; this.shieldStatus = shield; this.coords = coords; notifyObservers(); } @Override public void notifyObservers() { for (Observer o : observers){ o.update(this); } } @Override public void addObserver(Observer o) { observers.add(o); } @Override public void removeObserver(Observer o) { observers.remove(o); } public int getCurrentVelocity() { return currentVelocity; } public int getShieldStatus() { return shieldStatus; } public int[] getCoords() { return coords; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
public class SpaceDisplay implements Observer { Observable subject; @Override public void update(Object o){ if (o instanceof SpaceShipData){ SpaceShipData data = (SpaceShipData) o; System.out.println("Current velocity: "+data.getCurrentVelocity()); System.out.println("Coordinates: X="+data.getCoords()[0]+ " Y="+data.getCoords()[1]+ " Z="+data.getCoords()[2]); System.out.println("Shield status: "+data.getShieldStatus()); } } public SpaceDisplay(Observable o){ subject = o; subject.addObserver(this); } public void unSubscribe(){ subject.removeObserver(this); subject = null; } } |
UML-диаграмма:
Универсальный совет: стремитесь к слабым связям
Паттерн Наблюдатель