Дизайн приложения - обновление объекта домена - PullRequest
1 голос
/ 21 октября 2011

Я хотел бы улучшить дизайн некоторой части моего приложения. Это свинг-приложение, в котором пользовательский интерфейс обновляется данными, полученными с сервера (TCP / UDP). В данный момент я передаю свой доменный объект (POJO) в конструктор класса, который будет соединяться с сервером, получать и отправлять данные, и напрямую использовать методы getter и setter.

public static void main(String[] args) {
TcpClient client = new TcpClient(server, port, domainModel);
}

public class TcpClient {
public void connect() {
// Code to create the socket and connect to the server.

new Thread(new TcpProtocol(socket, domainModel)).start();
}
}

Я использую некоторый класс Factory внутри класса TcpProtocol для создания правильного объекта. Я хотел бы отделить мой предметный объект от части сетевого программирования. Есть ли какой-то общий шаблон для этого? Я думал о DAO и Value Object, обычно используемых для приложений JavaEE. Это единственное, что я вижу, но если у кого-то есть лучшее предложение, пожалуйста, дайте мне знать. Спасибо.

Ответы [ 4 ]

0 голосов
/ 21 октября 2011

Я бы предложил применить шаблон Observer . Вам также может понадобиться применить шаблон Mediator вместе с вашим наблюдателем - но проверьте внимательно, если ваш дизайн гарантирует такую ​​сложность.

Идея наблюдателя заключается в том, что ваш код пользовательского интерфейса «прислушивается» к изменениям в представленной модели. Когда происходят изменения (предположительно из вашего сетевого кода), происходит событие, и ваш пользовательский интерфейс, таким образом, получает уведомление для соответствующего обновления,

0 голосов
/ 21 октября 2011

Как общее правило, я считаю нетривиальный код в конструкторе запахом проекта, поскольку он усложняет наследование и другие формы расширяемости.

Если вам не нужно обновлять объект из сети после его создания, тогда вы можете использовать Factory для создания POJO. Я стараюсь избегать ValueObjects, если вы не заключаете что-либо в очень мало данных, таких как валюта / даты, в противном случае у вас будет куча получателей / установщиков.

Если вам нужен объект для доступа к сети во время его использования, тогда вы можете сделать его Proxy и передать DAO, который обрабатывает весь сетевой код. Для тестирования вы вместо этого передаете Mock/Stub.

0 голосов
/ 21 октября 2011

Может быть, использование java.io ObjectInputStream и ObjectOutputStream может быть простым способом сделать это, поскольку оно не зависит от класса передаваемого объекта?

0 голосов
/ 21 октября 2011

Начнем с достижения вашей цели будет удаление кода доступа к сети из вашего конструктора (я предполагаю, что у вас есть один класс, который связывается с сетью, и вы передаете свой POJO его конструктору).Вместо этого вы должны создать утилиту, которая связывается с сетью.

Чтобы создать экземпляр правильного типа объекта из вашего потока данных, вы можете подумать о создании Factory, который знает, как адаптировать поток к конкретным типам объектов.

...