они зависят друг от друга
Ну, на самом деле это не так. Слой «сокета» заботится только о том, чтобы он был запущен, запущен, опубликовал несколько сообщений и остановился.
Как все, что на самом деле делается / обрабатывается, его не волнует, он просто «запускается», когда ему говорят, обрабатывает входные / выходные сообщения, публикует уведомления и «останавливается», когда их просят.
Это в основном модель наблюдателя или, если хотите, модель производителя / потребителя.
Таким образом, уровень сокетов должен определить «протокол» поведения или контракта, с которым он готов работать. Часть этого контракта будет заключаться в том, «как» он генерирует уведомления о новых сообщениях либо через наблюдателя, либо, возможно, через блокировку / очередь только для чтения - решать вам.
Что касается пользовательского интерфейса, он немного сложнее, поскольку Swing является однопоточным, поэтому вам не следует блокировать пользовательский интерфейс при длительных или блокирующих операциях. Это где-то вроде SwingWorker
пригодится.
В основном он выступает посредником между пользовательским интерфейсом и механизмом, предоставляемым уровнем сокетов для приема сообщений. Сообщения приходят со слоя сокетов в SwingWorker
, SwingWorker
, а затем publish
направляют их в поток событий пользовательского интерфейса, который затем можно безопасно обновить в пользовательском интерфейсе
.
Может начинаться с Параллельность в Swing и Рабочие потоки и SwingWorker
Мой вопрос: как я могу их разделить и как я могу их соединить? Например, я пробовал подобные событиям с регистрацией таких методов:
Проблема в том, что это очень запутанно, если количество событий увеличивается!
Я так не думаю (ИМХО). То, что вы хотите сделать, это сосредоточиться на «классе» событий. Например, из вышесказанного у вас есть события «жизненного цикла», и у вас есть события «сообщения». Я бы начал с того, что разбил их на два отдельных интерфейса, поскольку те, кто интересуется событиями «сообщения», вероятно, не так заинтересованы в событиях «жизненного цикла», так как вы можете разделить наблюдателей на части.
Важной концепцией, которую вы хотите опробовать, является правильное использование `интерфейсов для определения" контрактов ", это становится" общедоступным "представлением реализаций, позволяя вам разрабатывать разные реализации для разных целей в соответствии с вашими идеями. изменить и расти. Это разъединяет код и позволяет изменять одну часть, не оказывая неблагоприятного влияния на другие части API