1
2定義定義物件間的一種一對多的依賴關係,當乙個物件的狀態發生改變時,所有依賴於它的物件都得到通知並被自動更新
角色抽象發布者:(subject)
具體發布者:(concretesubject)
抽象觀察者:(obeserver)
優點1、觀察者和被觀察者是抽象耦合的。 2、建立一套觸發機制。
缺點1、如果乙個被觀察者物件有很多的直接和間接的觀察者的話,將所有的觀察者都通知到會花費很多時間。
2、如果在觀察者和觀察目標之間有迴圈依賴的話,觀察目標會觸發它們之間進行迴圈呼叫,可能導致系統崩潰。
3、觀察者模式沒有相應的機制讓觀察者知道所觀察的目標物件是怎麼發生變化的,而僅僅只是知道觀察目標發生了變化
應用場景1.資訊聚合:像是微博上的相關關注
2.事件驅動系統:像是用於監聽特定的事件,比如像故障診斷的告警觸發
**需求:**實現乙個資料化程式
預設情況下我們是以十進位制格式展示乙個數值,現在我們同時將數值轉換成二進位制和十六進製制,當數值預設情況下的十進位制法生變法的同時相應的二進位制以及十六進製制也會發生變化
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 抽象發布者
class
publisher
:def
__init__
(self)
: self.observers =
defadd
(self, observer)
:if observer not
in self.observers:
else
:print
('failed to add: {}'
.format
(observer)
)def
remove
(self, observer)
:try
: self.observers.remove(observer)
except valueerror:
print
('failed to remove: {}'
.format
(observer)
)def
notify
(self)
:[o.update(self)
for o in self.observers]
# 具體發布者
class
defaultformatter
(publisher)
:def
__init__
(self, name)
: publisher.__init__(self)
self.name = name
self._data =
0def
__str__
(self)
:return
"{}: '{}' has data = {}"
.format
(type
(self)
.__name__, self.name, self._data)
@property
defdata
(self)
:return self._data
@data.setter
defdata
(self, new_value)
:try
: self._data =
int(new_value)
except valueerror as e:
print
('error: {}'
.format
(e))
else
: self.notify(
)# 具體觀察者
class
hexformatter
:def
update
(self, publisher)
:print
("{}: '{}' has now hex data = {}"
.format
(type
(self)
.__name__, publisher.name,
hex(publisher.data)))
class
binaryformatter
:def
update
(self, publisher)
:print
("{}: '{}' has now bin data = {}"
.format
(type
(self)
.__name__, publisher.name,
bin(publisher.data)))
defmain()
: df = defaultformatter(
'test1'
)print
(df)
print()
hf = hexformatter(
) df.add(hf)
df.data =
3print
(df)
print()
bf = binaryformatter(
) df.add(bf)
df.data =
21print
(df)
print()
df.remove(hf)
df.data =
40print
(df)
print()
df.remove(hf)
df.add(bf)
df.data =
'hello'
print
(df)
print()
df.data =
15.8
print
(df)
if __name__ ==
'__main__'
: main(
)
python觀察者模式 python 觀察者模式
python 觀察者模式 前言e 寫的倉促就不截uml類圖了,書本chapter10,p313能看到圖 一旦觀察的主題有更新,就會通知到觀察者們,下面的例子是最簡單的乙個觀察者範例,假設這是一群投機分子密切關注 軍 火 倉庫的產品與數量變動 class inventory def init self...
python 設計模式 觀察者 觀察者設計模式
在觀察者設計模式這種模式中,物件被表示為等待事件觸發的觀察者。一旦發生指定的事件,觀察者就會關注該主體。當事件發生時,主體告訴觀察者它已經發生。以下uml圖表示觀察者模式 如何實現觀察者模式?現在讓我們來看看如何實現觀察者模式。參考以下實現 import threading import time ...
python 觀察者模式
e 寫的倉促就不截uml類圖了,書本chapter10,p313能看到圖 一旦觀察的主題有更新,就會通知到觀察者們,下面的例子是最簡單的乙個觀察者範例,假設這是一群投機分子密切關注 軍 火 倉庫的產品與數量變動 class inventory def init self self.observers...