我有一个包含许多类的小应用程序。该应用程序旨在连接到服务器并发送/ recv二进制协议消息。
我让这部分使用连接管理器类和消息处理器类。连接管理器实例化并创建一个要发送的线程和一个用于recv消息的线程。在接收到消息时,实例化新的消息处理器对象以处理消息的解析。
我现在已经创建了一个具有连接,登录等按钮的GUI。
gui创建一个连接管理器实例,当按下连接按钮时,它调用connection manager.connect。
按下登录按钮时,它会调用connection manager.logon。
连接管理器对象有一个名为connected的布尔值。
所以gui可以读取连接manager.connected并查看true / false。现在我需要做的是从我的消息处理器对象访问连接manager.connected,每次收到消息时都会在连接管理器中创建。因此,如果消息处理器看到登录确认消息,则可以设置连接manager.connected = true,并且创建连接管理器对象的GUI可以读取该值。
但是我无法看到如何从消息处理器对象访问连接manager.connected。我认为这可能是我设计中的一个缺陷?
代码示例。
GUI在GUI文本字段中创建连接管理器对象读取
cm = new ConnectionManager(jTextField1.getText(), jTextField2.getText())
Connection Manager连接了一个布尔值。它还会从网络线程
创建读写public boolean connected;
executor.execute(new MessageProcessor(header, message, msgType));
在MessageProcessor内部我想更新cm.connected - 这可能吗?
由于
答案 0 :(得分:1)
您是否自己创建了MessageProcessor?如果是这样,您可以在构造函数中添加参数并发送对ConnectionManager的引用:
executor.execute(new MessageProcessor(header, message, msgType, this));
然后MessageProcessor将能够通过ConnectionManager访问连接。
答案 1 :(得分:1)
MessageProcessor应该保存对其调用ConnectionManager的引用。您可以在MessageProcessor的构造函数中传递引用并将其存储在实例变量中:
public class MessageProcessor {
private ConnectionManager cm;
public MessageProcessor(ConnectionManager cm) {
this.cm = cm;
}
public void process() {
cm.setConnected(false);
}
}
实例化MessageProcessor:
public class ConnectionManager {
public void connect() {
MessageProcessor pm = new MessageProcessor(this);
}
public void setConnected(boolean connected) {
this.connected = connected;
}
}
当然你已经连接了MessageProcessor和ConnectionManager。有(相当)复杂的解决方案,允许您决定"在MessageProcessor和ConnectionManager的实现之间的运行时。这些包括工厂模式和依赖注入。
答案 2 :(得分:0)
您打算如何从cm
对象访问MessageProcessor
?它还涉及对象之间的通信。如果你的发送/接收线程只有一个ConnectionManager
,并且你总是有一对线程(发送/接收),你可以简单地使用public static boolean connected
并在建立连接时将其设置为true
。这不是一个很好的解决方案,你有多个thead-couple(发送/接收活动)。我差点忘了,直到有人指出,你可以传递参数this
- 引用谁正在调用MessageProcessor
构造函数。但是,这仍然不是很好,因为类定义中的任何更改都会损害MessageProcessor
中的实现。
简单来说,是的,可以从connected
访问/变异MessageProcessor
- 您还应该考虑使用synchronized
方法来访问/变异connected
。但是,如果您需要更好地解决方案,则需要考虑使用单个connectionManager对象。 @sharonbn已经向您展示了如何实现这一目标的一些例子。