在觀察者設計模式中,觀察者觀察主體或觀察者。它會通過更新得到通知。我很困惑這兩件事是否是一回事?或者兩者之間存在細微差別?在觀察者設計模式中,Subject和Observable是一樣的東西嗎?
1
A
回答
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();}
};
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')
0
觀察者設計模式是使用一對多的關係 何時以及是否更新了主object.Observer 圖案是用於行爲設計patters一個例子來更新依賴對象使用。它有三個 演員這樣的主要類,從屬超類和它的子類。
看下面的觀察者設計模式的UML圖。
- 的
Circle
類是主類。它有一個保留所有觀察者的特殊屬性觀察者。它可以附加(或重新附加,如果需要的話)觀察者。 Observer
類是超類依賴關係。爲類Circle
提供常用方法是一個抽象類。- 兒童觀察者類(
AreaObserver
和PerimeterObserver
)是 - 我用
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級。
相關問題
- 1. 觀察者設計模式 - 具體主題和觀察者
- 2. 觀察者設計模式在Java中
- 3. 觀察者設計模式和其他
- 4. 管理者設計模式有這樣的東西嗎?
- 5. Python的觀察者設計模式
- 6. 設計模式 - 多觀察者
- 7. 設計模式觀察者(反向)
- 8. 觀察者設計模式vs「聽衆」
- 9. 一個類可以實現觀察者設計模式的主體部分和觀察者部分嗎?
- 10. 觀察者模式 - 觀察者創建
- 11. 內省函數是觀察者設計模式的一個例子嗎?
- 12. jQuery和觀察者模式
- 13. MVC和觀察者模式
- 14. Vue.js和觀察者模式
- 15. Java觀察者/ Observable更新
- 16. 觀察員?設計模式
- 17. 觀察者模式
- 18. 觀察者設計模式的故事是什麼?
- 19. 有沒有像裝飾者混合的觀察者那樣的設計模式?
- 20. 帶計時器的觀察者模式
- 21. 觀察者設計模式界面契約設計問題
- 22. 線程和Java中觀察者模式
- 23. 修復C++中的觀察者設計模式
- 24. 觀察者模式 - 可觀察的需要總是抽象的嗎?
- 25. 觀察者模式-受試者保持到由觀察者
- 26. 觀察者設計模式在休息應用程序
- 27. 異步觀察者模式
- 28. 實現觀察者模式
- 29. 瞭解觀察者模式
- 30. 觀察者模式imp
我現在更困惑了,因爲我現在有兩個不同的答案:D –
@HarisGhauri,我猜想basav試圖告訴的是:主體和觀察者不同,但您的問題是關於:Subject和Observable是否相同或不。 –