2015-05-02 73 views
0

在我在大學的面向對象講座中,我遇到了一個奇怪的觀察者模式,它與我在網上看到的不同。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(); 
     } 
    } 
} 
+2

'客戶端實現Observer'和'ObjServer extends Observable';他們是分開的類,沒有組合。或者你的意思是說它們都是在'Server'類中聲明/包含的? –

+1

有*一個大對象,*包含,*詞法,一個'Observer'和一個'Observable''它不會結合這兩個',它不能解決任何我能看到的具體問題。你需要知道'Observer'和'Observable'在Java中很少使用。我從未在18年內使用過它們。 – EJP

+0

並且*有*用例,其中observer-observable-hybrids *將*非常合理和適用。一種「p2p-觀察」。 – xerx593

回答

1

我不明白這與傳統的觀察者模式有何不同。您仍然有一個可觀察對象:ObjServer,以及一個觀察對象:Client。觀察者有一種方法來添加觀察者,並且回調添加的觀察者。

如何創建這些對象以及創建它們與觀察者模式無關。

注意的是,這些行:

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

沒有意義。爲什麼你要創建一個新的客戶端,並立即拋棄它,並將server.connect()返回的客戶端重新分配給變量?你可以簡單地做:

Client client = server.connect();