2015-10-01 18 views

回答

5

的觀測器的設計模式採取可用於每當受試者必須通過一個或多個觀察者來觀察。

Observable - 定義了將觀察者附加到客戶端和從客戶端上去除操作的接口或抽象類。在GOF書中,這個類/接口被稱爲主題

它們本質上是相同的。

1

主題和觀察者是兩個不同的實體(對象):

但是至於你的問題,

觀察者所觀察對象或受可觀察

的另一個名字是可觀察到,所以它們是相同的

對象維護觀察者列表和所有觀察者註冊在 學科。 因此,每當某個事件發生在主題上時,他都會通知所有觀察者。

例子:

假設你有一個叫HTTPEngine類處理所有HTTP相關的東西(連接,數據retreival等)。

對於HTTPEngine可跨不同對象重用,它維護一個說IHTTPObserver的列表。

因此,任何希望使用HTTPEngine的對象都會實現接口HTTPObserver,並在HTTPEngine上註冊,然後通知事件。

例如:

class HTTPObserver 
{ 
public: 
virtual void onEvent() = 0; 

} 

所以,說一類的名稱爲 「客戶」 想用HTTPENgine。現在

class client: public HTTPObserver 
{ 
    void onEvent(){//got the event notification} 
} 

,HTTPENgine維持觀察員名單:

class HTTPEngine 
{ 
private: 
vector<IHTTPObserver*> clients; 
public: 
void register(IHTTPObserver* client){clients.push_back(client);} 
void notifyclients(){ 
for(it=vector.begin();it!=Vector.end();it++) 
(*it)->notifyEvent();} 

}; 
+0

我現在更困惑了,因爲我現在有兩個不同的答案:D –

+0

@HarisGhauri,我猜想basav試圖告訴的是:主體和觀察者不同,但您的問題是關於:Subject和Observable是否相同或不。 –

1

是的,都是一樣的。

對象可以被觀察者觀察到。 主體保留觀察者列表,以便它可以通知這些觀察者任何狀態改變。

檢查下面Python代碼,從Wikipedia

class Observable: 
    def __init__(self): 
     self.__observers = [] 

    def register_observer(self, observer): 
     self.__observers.append(observer) 

    def notify_observers(self, *args, **kwargs): 
     for observer in self.__observers: 
      observer.notify(self, *args, **kwargs) 


class Observer: 
    def __init__(self, observable): 
     observable.register_observer(self) 

    def notify(self, observable, *args, **kwargs): 
     print('Got', args, kwargs, 'From', observable) 


subject = Observable() 
observer = Observer(subject) 
subject.notify_observers('test') 

enter image description here

0

觀察者設計模式是使用一對多的關係 何時以及是否更新了主object.Observer 圖案是用於行爲設計patters一個例子來更新依賴對象使用。它有三個 演員這樣的主要類,從屬超類和它的子類。

看下面的觀察者設計模式的UML圖。

enter image description here

  1. Circle類是主類。它有一個保留所有觀察者的特殊屬性觀察者。它可以附加(或重新附加,如果需要的話)觀察者。
  2. Observer類是超類依賴關係。爲類Circle提供常用方法是一個抽象類。
  3. 兒童觀察者類(AreaObserverPerimeterObserver)是
  4. 我用ObserverExample測試示例主類(Circle)的家屬。它不是Observer設計模式的內容。

Circle.java

public class Circle { 

    private List<Observer> observers; 
    private double radius; 

    public Circle() { 
     observers = new ArrayList<>(); 
    } 

    public double getRadius() { 
     return radius; 
    } 

    public void setRadius(double radius) { 
     this.radius = radius; 
     notifyObservers(); 
    } 

    /** 
    * attach an observer to the circle 
    */ 
    public void attach(Observer observer) { 
     observers.add(observer); 
    } 

    /** 
    * notify all observers on update 
    */ 
    public void notifyObservers() { 
     for (Observer observer : observers) { 
      observer.update(); 
     } 
    } 
} 

Observer.java

public abstract class Observer { 

    protected Circle circle; 

    public Observer(Circle circle) { 
     this.circle = circle; 
    } 

    public abstract void update(); 
} 

AreaObserver.java

public class AreaObserver extends Observer { 

    public AreaObserver(Circle circle) { 
     super(circle); 
    } 

    @Override 
    public void update() { 
     System.out.printf("New area is: %f\n", Math.PI * circle.getRadius() * circle.getRadius()); 
    } 
} 

PerimeterObserver.java

public class PerimeterObserver extends Observer { 

    public PerimeterObserver(Circle circle) { 
     super(circle); 
    } 

    @Override 
    public void update() { 
     System.out.printf("New Perimeter is: %f\n", 2 * Math.PI * circle.getRadius()); 
    } 
} 

ObserverExample.java

public class ObserverExample { 

    public static void main(String[] args) { 
     Circle circle = new Circle(); 

     PerimeterObserver perimeterObserver = new PerimeterObserver(circle); 
     circle.attach(perimeterObserver); 

     AreaObserver areaObserver = new AreaObserver(circle); 
     circle.attach(areaObserver); 

     System.out.println("Set radius: 7.0"); 
     System.out.println("---------------"); 
     circle.setRadius(7.0); 

     System.out.println(); 

     System.out.println("Set radius: 5.0"); 
     System.out.println("---------------"); 
     circle.setRadius(5.0); 
    } 
} 

OUTPUT:

Set radius: 7.0 
--------------- 
New Perimeter is: 43.982297 
New area is: 153.938040 

Set radius: 5.0 
--------------- 
New Perimeter is: 31.415927 
New area is: 78.539816 

根據似乎所有的觀察者更新更新,當輸出邁n級。