В этом случае окна чата и игры будут считаться наблюдателями. Вы захотите реализовать интерфейс, называемый чем-то вроде Observers (у java API есть собственный шаблон Observer на java.util.Observer, но вы можете реализовать свой собственный), и в вашем окне чата и доски объявлений их можно реализовать. Вы можете выглядеть так:
public interface Observer
{
public void postUpdate(String newData);
}
postUpdate - это функция, которую должны определить все наблюдатели, и оба эти класса и все, что вы хотите добавить позже, должны будут реализовать Observer, например:
public class ChatWindow Implements Observer
{
//bla bla bla
}
Тогда в вашем сетевом классе вам понадобится метод, подобный
public void addObserver(Observer newObserver)
{
//Do something here to add the new Observer to some list of Observers, maybe a
//List<Observer> or something?
}
Затем во время инициализации вы захотите вызывать функцию addObserver у каждого наблюдателя, которого вы хотите наблюдать, и иметь некоторую логику в своем сетевом классе для обновления всех, кто зарегистрировался, путем вызова их функций postUpdate. В этом случае я действовал так, как будто вы хотите отправить им строку, содержащую новые данные, это только один вариант. Вы также можете сделать так, чтобы он ничего не передавал и просто действовал как уведомление о том, что произошло обновление, и в этом случае наблюдатели будут нести ответственность за проверку того, изменились ли данные, которые им нужны из сети; или, может быть, вы могли бы передать ему некоторые данные, представляющие, что именно было обновлено в сети, чтобы класс мог знать, заботится ли он о том, что изменилось (например, игровая доска может не заботиться, произошло ли единственное изменение в данных чата) так что больше ничего не надоедать).
Наилучшие успехи в изучении шаблонов «Head First Design Patterns» вы можете найти в книгах.