Python: Observer Pattern

 

GeovinDuObserver.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# 观察者模式  Observer Pattern
# The Observer class that recieves updates from the ticker on a specific symbol:
class TickerObserver(object):
 
    def __init__(self, tickerSymbol):
        self.tickerSymbol = tickerSymbol
        self.lastPrice = 0.0
 
    def Update(self, symbol, price):
        if symbol == self.tickerSymbol:
            self.lastPrice = price
 
    def GetTicker(self):
        return self.tickerSymbol + " : " + str(self.lastPrice)
 
 
# The ticker subject that sends out updates to all observers:
class StockTicker(object):
 
    def __init__(self):
        self.observers = []
 
    def AttachObserver(self, tickerObserver):
        self.observers.append(tickerObserver)
 
    def RemoveObserver(self, tickerObserver):
        self.observers.remove(tickerObserver)
 
    def Notify(self, symbol, price):
        for observer in self.observers:
            observer.Update(symbol, price)
 
 
class Subject:
    """Represents what is being observed"""
 
    def __init__(self):
 
        """create an empty observer list"""
 
        self._observers = []
 
    def notify(self, modifier=None):
 
        """Alert the observers"""
 
        for observer in self._observers:
            if modifier != observer:
                observer.update(self)
 
    def attach(self, observer):
 
        """If the observer is not in the list,
        append it into the list"""
 
        if observer not in self._observers:
            self._observers.append(observer)
 
    def detach(self, observer):
 
        """Remove the observer from the observer list"""
 
        try:
            self._observers.remove(observer)
        except ValueError:
            pass
 
 
class Data(Subject):
    """monitor the object"""
 
    def __init__(self, name=''):
        Subject.__init__(self)
        self.name = name
        self._data = 0
 
    @property
    def data(self):
        return self._data
 
    @data.setter
    def data(self, value):
        self._data = value
        self.notify()
 
 
class HexViewer:
    """updates the Hexviewer"""
 
    def update(self, subject):
        print('HexViewer十六进制查看器: 实验对象 {} 转换的数据为: 0x{:x}'.format(subject.name, subject.data))
 
 
class OctalViewer:
    """updates the Octal viewer"""
 
    def update(self, subject):
        print('OctalViewer八进制查看器: 实验对象' + str(subject.name) + '转换的数据为 ' + str(oct(subject.data)))
 
 
class DecimalViewer:
    """updates the Decimal viewer"""
 
    def update(self, subject):
        print('DecimalViewer十进制查看器: 实验对象 % s 转换的数据为 % d' % (subject.name, subject.data))
 
 
"""main function"""

  

main.py 调用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 观察者模式  Observer Pattern
obj1 = GeovinDuObserver.Data('Data 1')
obj2 = GeovinDuObserver.Data('Data 2')
 
view1 = GeovinDuObserver.DecimalViewer()
view2 = GeovinDuObserver.HexViewer()
view3 = GeovinDuObserver.OctalViewer()
 
obj1.attach(view1)
obj1.attach(view2)
obj1.attach(view3)
 
obj2.attach(view1)
obj2.attach(view2)
obj2.attach(view3)
 
obj1.data = 10
obj2.data = 15
 
print("\n")

  

输出:

1
2
3
4
5
6
DecimalViewer十进制查看器: 实验对象 Data 1 转换的数据为  10
HexViewer十六进制查看器: 实验对象 Data 1 转换的数据为: 0xa
OctalViewer八进制查看器: 实验对象Data 1转换的数据为 0o12
DecimalViewer十进制查看器: 实验对象 Data 2 转换的数据为  15
HexViewer十六进制查看器: 实验对象 Data 2 转换的数据为: 0xf
OctalViewer八进制查看器: 实验对象Data 2转换的数据为 0o17

  

 

posted @   ®Geovin Du Dream Park™  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
历史上的今天:
2011-10-24 Csharp windowform bindingNavigator,bindingSource,DataGridView簡單分頁:首頁,上一頁,下一頁,末頁
2009-10-24 World Currency Symbols世界货币符号
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示