例子1:

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
class  Service:
     def  __init__( self , service_name, process_name, port, enable_monitor = None ):
         self .service_name  =  service_name
         self .process_name  =  process_name
         self .port  =  port
         self .mon  =  enable_monitor
         self ._process_status  =  True
         self ._port_status  =  True
 
     @ property
     def  process_status( self ):
         return  self ._process_status
 
     @process_status.setter
     def  process_status( self , status):
         self ._process_status  =  status
         self .mon.start_mon()
 
     @ property
     def  port_status( self ):
         return  self ._port_status
 
     @port_status.setter
     def  port_status( self , status):
         self ._port_status  =  status
         self .mon.start_mon()
 
class  Action:
     @ classmethod
     def  send_sms_alarm( cls , content):
         print ( "SMS Alarm: {}" . format (content))
 
     @ classmethod
     def  send_email_alarm( cls , content):
         print ( "Email Alarm: {}" . format (content))
 
class  Monitor:
     def  __init__( self ):
         self .services  =  []
 
     def  add_service( self , service):
         self .services.append(service)
 
     def  start_mon( self ):
         for  ser  in  self .services:
             if  not  ser.process_status:
                 Action.send_email_alarm( "Service: {0} Process: {1} Status: {2}" . format (
                     ser.service_name, ser.process_name, ser.process_status))
             if  not  ser.port_status:
                 Action.send_email_alarm( "Service: {0} Process: {1} Status: {2}" . format (
                     ser.service_name, ser.port, ser.port_status))
 
if  __name__  = =  '__main__' :
     mon  =  Monitor()
 
     http  =  Service( "http" "httpd" 80 , mon)
     mysql  =  Service( "mysql" "mysqld" 3306 , mon)
     zabbix  =  Service( "zabbix" "zabbixd" 1501 , mon)
 
 
     mon.add_service(http)
     mon.add_service(mysql)
     mon.add_service(zabbix)
 
     #mon.start_mon()
 
     http.port_status  =  False


例子2:

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
#coding:utf-8
 
#Inventory类描述仓库对象
class  Inventory:
     def  __init__( self ):
         self .observers  =  []  #此列表用于存储观察者对象
         self ._product  =  None  #产品
         self ._quantity  =  0  #数量
 
     def  attach( self , observer):  #此方法用于将观察者对象添加进列表
         self .observers.append(observer)
 
     @ property  #使用property装饰器修饰,使方法变成属性
     def  product( self ):
         return  self ._product
 
     @product.setter  #使用setter修饰product属性使其可以设置值
     def  product( self , value):
         self ._product  =  value
         self ._update_observers()  #只要设置了产品的值,就调用 _update_observers方法
 
     @ property  #对数量的设置
     def  quantity( self ):
         return  self ._quantity
 
     @quantity.setter
     def  quantity( self , value):
         self ._quantity  =  value
         self ._update_observers()  #只要设置了数量的值,就调用 _update_observers方法
 
     def  _update_observers( self ):
         for  observer  in  self .observers:  #遍历观察者对象
             observer()  #直接用()号调用观察者对象,之所以可以直接调用,是因为在ConsoleObserver类中实现了__call__方法
 
#ConsoleObserver类描述观察者对象
class  ConsoleObserver:
     def  __init__( self , inventory):
         self .inventory  =  inventory
 
     def  __call__( self ):  #实现__call__方法后可直接可调用,这里的工作是print了产品和数量信息
         print ( "product: {0}, quantity: {1}" . format ( self .inventory.product,  self .inventory.quantity))
 
if  __name__  = =  '__main__' :
 
     =  Inventory()  #创建仓库对象
     =  ConsoleObserver(i)  #创建一个观察者对象,并将仓库对象作为初始化参数
     i.attach(c)  #将观察者对象添加到仓库对象中的observers列表里(两个对象之间的交互)
 
     i.product  =  "Widget"  #仓库对象设置产品名称(有发生改动)
     i.quantity  =  5  #仓库对象设置产品数量(有发生改动)
 
     '''
     工作流分析:
         1、首先增加了一个产品名称,因此通知观察者打印,此时打印出了新添加的产品名称,数量默认为0
         2、之后,又增加了数量5,那么又通知了观察者,此时打印出了之前添加的产品名称和这一次新增加的数量5
     '''