// Esempio per il design pattern Mediator
/** Elemento e' un Colleague */
public interface Elemento {
public void put(final String s);
public void put(final int v);
public String doWork();
public void reset();
}
/** Numeri e' un ConcreteColleague */
public class Numeri implements Elemento {
private final Central m;
private final int[] seq = { 8, 13, 21 };
private final int[] num = new int[3];
private int i = 0;
public Numeri(final Central c) {
m = c;
System.out.println("Indovina i successivi tre numeri della sequenza 2, 3, 5, ...");
}
@Override
public void put(final String msg) {
System.out.print(msg + " ");
if (i == 3)
System.out.println("Bravo, sequenza corretta");
else
System.out.println("Sequenza non corretta");
}
@Override
public String doWork() {
System.out.println("Hai inserito: " + num[0] + " " + num[1] + " " + num[2]);
if (seq[0] == num[0] && seq[1] == num[1] && seq[2] == num[2]) {
System.out.println("Hai indovinato la sequenza");
m.stop();
} else
System.out.println("Non hai indovinato la sequenza, riprova");
i = 0;
return null;
}
@Override
public void put(final int v) {
if (i < 3) {
num[i] = v;
i++;
}
if (i == 3)
doWork();
}
@Override
public void reset() {
i = 0;
}
}
/** Sommatore e' un ConcreteColleague */
public class Sommatore implements Elemento {
private final Central m;
private int somma = 0;
private int count = 0;
private int media = 0;
public Sommatore(final Central c) {
m = c;
}
@Override
public void put(final String msg) {
System.out.println(msg);
doWork();
System.out.println("La somma e': " + somma);
System.out.println("La media e': " + media);
}
@Override
public String doWork() {
if (count > 0)
media = somma / count;
return null;
}
@Override
public void put(final int v) {
count++;
somma += v;
if (somma >= 100)
m.stop();
}
@Override
public void reset() {
somma = 0;
count = 0;
}
}
/** Nomi e' un ConcreteColleague */
public class Nomi implements Elemento {
private final Central m;
private final String[] seq = { "Monica", "Erica", "Rita", "Tina", "Sandra", "Mary", "Jessica" };
private final String[] nom = new String[3];
private final int iniz = 2;
private int i = 0;
public Nomi(final Central c) {
m = c;
System.out.println("Indovina i successivi tre nomi: " + seq[0] + " " + seq[1] + " ...");
}
@Override
public void put(final String msg) {
if (i < 3) {
nom[i] = msg;
i++;
}
if (i == 3)
doWork();
}
@Override
public String doWork() {
System.out.println("Hai inserito: " + nom[0] + " " + nom[1] + " " + nom[2]);
if (seq[iniz].equals(nom[0]) && seq[iniz + 1].equals(nom[1]) && seq[iniz + 2].equals(nom[2])) {
System.out.println("Benissimo, i nomi sono corretti");
m.stop();
} else
System.out.println("Non hai indovinato i nomi, riprova");
i = 0;
return null;
}
@Override
public void put(final int v) {
if (i == 3)
System.out.println("Bravo! Hai indovinato la sequenza di nomi");
else
System.out.println("Non hai indovinato la sequenza di nomi");
}
@Override
public void reset() {
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/** KeyListen e' un ConcreteColleague */
public class KeyListener implements Elemento {
private final Central m;
private BufferedReader inp;
private int count = 0;
public KeyListener(final Central c) {
m = c;
System.out.println("Scrivi un numero o una lettera e premi invio");
System.out.println("Per uscire scrivi q");
}
@Override
public String doWork() {
try {
inp = new BufferedReader(new InputStreamReader(System.in));
String str = inp.readLine();
count++;
if (count == 10)
m.stop();
return str;
} catch (final IOException ioe) {
System.err.println(ioe);
}
return null;
}
@Override
public void put(final String msg) {
System.out.println("Hai inserito " + count + " input");
}
@Override
public void put(final int v) {
}
@Override
public void reset() {
}
}
/** Central e' un Mediator */
public class Central {
private Elemento s = new Sommatore(this);
private Elemento k = new KeyListener(this);
private Elemento n = new Numeri(this);
private Elemento nm = new Nomi(this);
private boolean active = true;
public void init() {
String s;
do {
s = k.doWork();
if (s.equals("q"))
break;
alert(s);
} while (active);
}
public void alert(String str) {
try {
int v = Integer.parseInt(str);
s.put(v);
n.put(v);
} catch (NumberFormatException nfe) {
n.reset();
s.reset();
nm.put(str);
}
}
public void stop() {
active = false;
n.put("Numeri:");
s.put("Somma:");
nm.put(0);
}
}
public class MainDialog {
public static void main(final String[] args) {
final Central c = new Central();
c.init();
}
}