А вот решение второй задачи уже зависит от того, что такое «карта», каковы критерии оптимальности, и т. п.
Мм, да, получается без интерфейса вроде HasEvents все равно не обойтись, т.к. надо чтобы у всех имеющих события классов был в наличии метод getEvent().Вы что-то странное придумали, и теперь решаете несуществующую проблему.
class Person
{
private final Event.Owner mItDone = new Event.Owner();
public Person()
{
mItDone.addReaction(new myReaction()); //myReaction будет выполнено сразу при наступлении события
}
private void eventOccurs()
{
mItDone.fire(); //Запускает событие
}
public Event getEvent()
{
return mItDone.getEvent(); // Предоставляем другим классам возможность подписаться на событие.
}
}