gpt4 book ai didi

java - MetaController 应该观察三个对象

转载 作者:行者123 更新时间:2023-12-01 23:36:44 25 4
gpt4 key购买 nike

我陷入了思维循环,或者至少缺乏对如何实现观察者模式的理解。我想要的 Controller 实现了 Observer 因为它实际上是为了观察它控制的实例。

被观察的对象扩展了Observable因为它们实际上是由 Controller 观察的。我在什么情况下调用 .addObserver(responseHandler);?另一个类向实例添加一个观察者,从字面上看,它实现了“Observer”接口(interface)?这不可能是正确的。

-----编辑-----responseHandler只是一些未知 Controller 的通用名称

顺便说一句,用 Java 实现的这种模式是否存在命名问题,或者只是我缺乏理解?

这是 Controller ,现在已经变成了 Controller 的 Controller :

public class MetaController implements Observer {

private final static Logger LOG = Logger.getLogger(MetaController.class.getName());
private Printer telnetPrinter = new Printer();
private telnetDataProcessor telnetDataProcessor = new telnetDataProcessor();
private StringReader stringReader = new StringReader();
private final ConcurrentLinkedQueue<Character> telnetData = new ConcurrentLinkedQueue();

public MetaController() {
}

//the printer and processor each spawn their own thread so that they don't
//block each other waiting for each other
public void readPrintParse(final InputStream inputStream) throws SocketException, IOException {
telnetPrinter.print(inputStream, telnetData); //populate telnetData in its own thread
telnetDataProcessor.read(telnetData); //process telnetData in its own thread
}

//the StringReader just looks for particular keywords like "press enter to continue"
//so that some phrases will trigger a response
//commands may also be typed manually by the user (not implemented yet)
@Override
public void update(Observable o, Object arg) {
//when telnetDataProcessor sends a String, send that String on to stringReader
String cmd = stringReader.parse(null); //parse what and how?
//send the command string back to the telnetClient
}
}

阅读API不幸的是,直接对我来说没有启发。

这是 Apache WeatherTelnet 的扩展 example ,一种穷人 Netty,允许并发脚本化 telnet 和实时 telnet 响应,以实现简单的 MUD client ,这需要实时处理非终止的 telnet 数据流,以及实时输出和用户输入。

最佳答案

您的Observable对象应该addObserver(yourController);。当他们改变时,他们应该调用 setChanged()然后notifyObservers() 。如果您需要自定义行为,您显然可以重写这些方法。

例如:

MetaController controller = new MetaController();
Observable observable1 = new Weather1();
Observable observable2 = new Weather2();
Observable observable3 = new Weather3();
observable1.addObserver(controller);
observable2.addObserver(controller);
observable3.addObserver(controller);

您还可以将 Observable 的引用提供给 Controller (Observer)(如果他也是修改它的人)。

不存在命名问题。 Observer 需要向 Observable 注册,以便它知道如何通知它们。

警告:如果这要在多线程环境中使用,则必须小心在 Controller 类中使用共享数据。

关于java - MetaController 应该观察三个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18554647/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com