在我在大學的面向對象講座中,我遇到了一個奇怪的觀察者模式,它與我在網上看到的不同。Java替代觀察者模式
而不是在兩個不同的對象分離Observable和Observer,有一個大的對象,它結合了兩者。另外,Superobject得到了一個方法,它返回觀察者(作爲句柄)。
我的講師告訴我,這種實現模式的方式將解決一個架構問題,如果我們擴展它,會導致update-method爆炸。我想我得到他的大部分意圖。
我現在的問題是,我沒有其他的來源來了解這個'替代'Observer-Pattern,或者至少我無法找到關於該模式的文章。雖然我認爲我明白了講師的觀點,但我不認爲我完全理解這個模式,即將所有課程壓縮在一起的好處。
有人可以詳細說明,爲什麼這個架構會使我的代碼受益?或者爲什麼我不能簡單地將更新方法的邏輯提取到實用程序類中?
下面是我們構建的(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();
}
}
}
'客戶端實現Observer'和'ObjServer extends Observable';他們是分開的類,沒有組合。或者你的意思是說它們都是在'Server'類中聲明/包含的? –
有*一個大對象,*包含,*詞法,一個'Observer'和一個'Observable''它不會結合這兩個',它不能解決任何我能看到的具體問題。你需要知道'Observer'和'Observable'在Java中很少使用。我從未在18年內使用過它們。 – EJP
並且*有*用例,其中observer-observable-hybrids *將*非常合理和適用。一種「p2p-觀察」。 – xerx593