Java 备选观察者模式
Java alternative Observer Pattern
在大学的面向对象讲座中,我遇到了一个奇怪的观察者模式,它与我在网上看到的不同。
不是将 Observable 和 Observer 分成两个不同的对象,而是将两者结合在一起的一个大对象。此外,超级对象有一个方法,returns 观察者(作为句柄)。
我的讲师告诉我,这种实现模式的方式将解决一个架构问题,如果我们扩展它会导致更新方法爆炸。我想我明白了他的大部分意图。
我现在的问题是,我没有其他资源可以了解这个 'alternative' 观察者模式,或者至少我找不到关于该模式的文章。虽然我想我明白了讲师的意思,但我不认为我完全理解这种模式,即压缩所有 class 的好处。
任何人都可以详细说明为什么这种架构对我的代码有益吗?或者为什么我不能简单地将更新方法的逻辑提取到实用程序中 class?
下面是我们构建的(java)class。我删除了一些不必要的逻辑。
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();
在大学的面向对象讲座中,我遇到了一个奇怪的观察者模式,它与我在网上看到的不同。
不是将 Observable 和 Observer 分成两个不同的对象,而是将两者结合在一起的一个大对象。此外,超级对象有一个方法,returns 观察者(作为句柄)。
我的讲师告诉我,这种实现模式的方式将解决一个架构问题,如果我们扩展它会导致更新方法爆炸。我想我明白了他的大部分意图。
我现在的问题是,我没有其他资源可以了解这个 'alternative' 观察者模式,或者至少我找不到关于该模式的文章。虽然我想我明白了讲师的意思,但我不认为我完全理解这种模式,即压缩所有 class 的好处。
任何人都可以详细说明为什么这种架构对我的代码有益吗?或者为什么我不能简单地将更新方法的逻辑提取到实用程序中 class?
下面是我们构建的(java)class。我删除了一些不必要的逻辑。
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();