【问题标题】:Application design - Updating domain object应用程序设计 - 更新域对象
【发布时间】:2011-12-12 13:50:42
【问题描述】:

我想改进我的应用程序某些部分的设计。它是一个摇摆应用程序,其中用户界面通过从服务器(TCP/UDP)接收到的数据进行更新。目前我将我的域对象(PO​​JO)传递给类的构造函数,它将与服务器连接,接收和发送数据,并直接使用 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 类中使用某种 Factory 类来创建正确的对象。 我想将我的域对象与网络编程部分分离。有一些常见的模式可以用来做这个吗?我在考虑通常用于 JavaEE 应用程序的 DAO 和值对象。这些是我看到的唯一一个,但如果有人有更好的建议,请告诉我。 谢谢。

【问题讨论】:

    标签: java swing architecture network-programming


    【解决方案1】:

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

    要从数据流中实例化正确的对象类型,您可以考虑创建一个知道如何使流适应特定对象类型的Factory

    【讨论】:

      【解决方案2】:

      作为一般规则,我认为构造函数中的重要代码是一种设计气味,因为它使继承和其他形式的可扩展性变得复杂。

      如果您不需要对象在创建后从网络更新自身,那么您可以使用Factory 来创建您的POJO。我倾向于避免使用ValueObjects,除非您使用非常少的数据(例如货币/日期)来包装某些东西,否则您最终会得到一堆 getter/setter。

      如果您需要对象在使用过程中访问网络,则可以将其设为Proxy 并传入处理所有网络代码的DAO。为了进行测试,您改为传递 Mock/Stub

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          我建议做的是应用Observer 模式。您可能还需要将Mediator 模式与您的观察者一起应用 - 但请仔细检查您的设计是否 保证这种复杂性。

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

          【讨论】:

            猜你喜欢
            • 2016-02-22
            • 1970-01-01
            • 2021-12-27
            • 1970-01-01
            • 2011-04-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多