Wzorzec operacyjny Mediator jest wykorzystywany do skupiania złożonych procedur komunikacji i sterowania w środowisku powiązanych obiektów. Obiekty w systemie zamiast komunikować się między sobą bezpośrednio robią to poprzez klasę Mediatora – nie muszą wtedy wiedzieć o swoim własnym istnieniu bezpośrednio. Wysyłają informację do mediatora, a on przekaże go do obiektu, który ma być celem żądania. Pozwala to na łatwą przyszłą modyfikację aplikacji, ponieważ wszystkie wpólne relacje są w jednym miejscu.
Sprawdźmy działanie programu, który oddziela obiekt wysyłający informacje, od obiektu który jest odbiorcą tych wiadomości.
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 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
public class Mediator { private boolean slotFull = false; private int number; public synchronized void storeMessage(int num) { while (slotFull == true) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } slotFull = true; number = num; notifyAll(); } public synchronized int retrieveMessage() { while (slotFull == false) try { wait(); } catch (InterruptedException e) { } slotFull = false; notifyAll(); return number; } } class Producer extends Thread { private Mediator med; private int id; private static int num = 1; public Producer(Mediator m) { med = m; id = num++; } public void run() { int num; while (true) { med.storeMessage(num = (int) (Math.random() * 100)); System.out.println("p" + id + "-" + num + " "); } } } class Consumer extends Thread { private Mediator med; private int id; private static int num = 1; public Consumer(Mediator m) { med = m; id = num++; } public void run() { while (true) { System.out.println("c" + id + "-" + med.retrieveMessage() + " "); } } } class MediatorDemo { public static void main(String[] args) { Mediator mb = new Mediator(); new Producer(mb).start(); new Producer(mb).start(); new Consumer(mb).start(); new Consumer(mb).start(); new Consumer(mb).start(); new Consumer(mb).start(); } } |
Diagram wzorca: