Java 应用程序设计-更新域对象

Java 应用程序设计-更新域对象,java,swing,architecture,network-programming,Java,Swing,Architecture,Network Programming,我想改进我的应用程序的某些部分的设计。它是一个swing应用程序,其中用户界面由从服务器TCP/UDP接收的数据更新。此时,我将域对象POJO传递给类的构造函数,该类将与服务器连接,接收和发送数据,并直接使用getter和setter方法 public static void main(String[] args) { TcpClient client = new TcpClient(server, port, domainModel); } public class TcpClient {

我想改进我的应用程序的某些部分的设计。它是一个swing应用程序,其中用户界面由从服务器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();
}
}
我在TcpProtocol类中使用某种工厂类来创建正确的对象。 我想将我的域对象与网络编程部分分离。是否有一些通用模式可用于此?我考虑的是DAO和Value对象,它们通常用于JavaEE应用程序。这是我唯一看到的,但如果有人有更好的建议,请告诉我。
谢谢。

实现目标的一个开始是从构造函数中删除网络访问代码。我假设您有一个类与网络联系,并且您正在将POJO传递给它的构造函数。而是创建一个与网络联系的实用程序


从数据流中实例化正确的对象类型,您可以考虑创建一个知道如何将流适配到特定对象类型的工厂。

< P>作为一个一般规则,我认为构造函数中的非平凡代码是一种设计气味,因为它使继承和其他形式的可扩展性变得复杂。 如果创建对象后不需要从网络更新对象本身,则可以使用工厂来创建POJO。我倾向于避免使用ValueObjects,除非您使用很少的数据(如货币/日期)包装某些东西,否则最终会遇到一堆getter/setter


如果在使用过程中需要该对象访问网络,则可以将其作为代理并传入一个处理所有网络代码的DAO。对于测试,您将传入一个模拟/存根。

也许使用java.io ObjectInputStream和ObjectOutputStream可能是一种简单的方法,因为它不依赖于所传输对象的类?

我建议应用该模式。您可能还需要与您的观察者一起应用该模式,但请仔细检查您的设计是否正确 这就证明了这种复杂性

观察者背后的想法是您的UI代码侦听所呈现模型中的更改。当您的网络绑定代码可能发生更改时,会触发一个事件,并因此通知您的UI,以便相应地更新自身