gpt4 book ai didi

Java替代观察者模式

转载 作者:行者123 更新时间:2023-12-01 11:35:52 25 4
gpt4 key购买 nike

在大学的面向对象讲座中,我遇到了一种奇怪的观察者模式,它与我在网上看到的不同。

不是将 Observable 和 Observer 分开在两个不同的对象中,而是将两者结合在一起的一个大对象。此外, super 对象有一个方法,它返回观察者(作为句柄)。

我的讲师告诉我,这种实现模式的方式将解决架构问题,如果我们扩展它,就会导致更新方法爆炸。我想我明白了他的大部分意图。

我现在的问题是,我没有其他来源来了解这种“替代”观察者模式,或者至少我无法找到有关该模式的文章。虽然我认为我明白了讲师的观点,但我认为我没有完全理解这种模式,即将所有类压缩在一起的好处。

任何人都可以详细说明为什么这种架构会对我的代码有利吗?或者为什么我不能简单地将更新方法的逻辑提取到实用程序类中?

下面是我们构建的(java)类。我删除了一些不必要的逻辑。

import java.util.Observable;
import java.util.Observer;
import java.util.concurrent.Semaphore;

public class Server implements InterfaceServer {
public Client client;
private final ObjServer oServer;

public Server() {
oServer = new ObjServer();
new Thread(server).start();
}

public Client connect() throws InterruptedException {
Client handle = new Client();
oServer.addObserver(handle);
return handle;
}

public class ObjServer extends Observable implements Runnable {

@Override
public void run() {
while (true) {
// pull data

setChanged();
notifyObservers(m);
}
}
}

public static class Client implements Observer {

private Object obj;
private Semaphore semaphore = new Semaphore(0, true);

public Object getObject() throws InterruptedException {
semaphore.acquire();
System.out.println(obj);

return obj;
}

@Override
public void update(Observable o, Object arg) {
obj = arg;
semaphore.release();
}

}

public static void main(String... args) throws Exception {
Server server = new Server();

Client client = new Client();

client = server.connect();

while (true) {
client.getObject();
}
}
}

最佳答案

我不明白这与传统的观察者模式有何不同。您仍然拥有一个可观察对象:ObjServer 和一个观察者对象:Client。并且 observable 有一个添加观察者的方法,并且它会回调添加的观察者。

这些对象如何创建以及谁创建它们与观察者模式无关。

请注意这些行:

Client client = new Client();
client = server.connect();

没有什么意义。为什么要创建一个新的 Client,然后立即将其丢弃并将 server.connect() 返回的 client 重新分配给变量?你可以简单地做

Client client = server.connect();

关于Java替代观察者模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30001099/

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