Schema generale delle classi

dati

oggetto gettone: ManagerPosizione,
che contiene l'oggetto LinkPosizione

public class ManagerPosizione {
	LinkPosizione link;

	private ManagerPosizione(LinkPosizione link) {
		this.link = link;
	}

	public LinkPosizione getLink() {
		return this.link;
	}

	public static void addPosizione(LinkPosizione link) {
		ManagerPosizione manager = new ManagerPosizione(link);
		link.getAutobus().setPerManagerPosizione(manager);
		link.getAutorimessa().addPerManagerPosizione(manager);
	}

	public static void removePosizione(LinkPosizione link) {
		ManagerPosizione manager;
		manager = new ManagerPosizione(null);
		link.getAutobus().setPerManagerPosizione(manager);
		manager = new ManagerPosizione(link);
		link.getAutorimessa().removePerManagerPosizione(manager);
	}
}

classe dati: ha i metodi addPerManagerPosizione() etc.

public class Autobus implements Listener {
	…

	private LinkPosizione posizione;

	public LinkPosizione getPosizione() {
		return this.posizione;
	}

	public void setPosizione(LinkPosizione posizione) {
		ManagerPosizione.addPosizione(posizione);
	}

	public void setPerManagerPosizione(ManagerPosizione manager) {
		if (manager == null)
			throw new RuntimeException("manager posizione vuoto");
		this.posizione = manager.getLink();
	}

	…
comportamenti e attività
oggetto unico: TaskExecutor
comportamento o attività da eseguire in modo esclusivo: Task
public interface Task {
	public void esegui();
}

public final class TaskExecutor {
	public static TaskExecutor getInstance() {
		…
	}
	public synchronized void perform(Task t) {
		…
	}
}

public class Autobus implements Listener {
	…

	public void fired(Evento e) {
		TaskExecutor.getInstance().perform(new AutobusFired(this, e));
	}

	…
}
public class AutobusFired implements Task {
	…

	@Override
	public void esegui() {
		…
	}

	…
}
public class VerificaPeriodica implements Runnable {
	…

	Periodica p = new Periodica(autobus);
	TaskExecutor.getInstance().perform(p);

	…
}
public class Periodica implements Task {
	…

	@Override
	public void esegui() {
		…
	}

	…
}
invio messaggi
public class AutobusFired implements Task {
	…

	Environment.aggiungiEvento(new Entrata(this.autobus, this.autobus.precedente, rimessa));

	…
}