设计模式之观察者模式的Python实现案例
1、打开Python开发工具IDLE,新建‘observer.py’文件,先假设一个简单的应用场景,把上课状态及时通知给学生和老师。先创建一个观察者父类。代码如下:
class observe:
def update(self,skzt):
pass
def display(self):
pass

2、创建observe父类的两个子类,student和teacher,并实现父类的update和
dispaly方法,代码如下;
class student(observe):
def __init__(self,name):
self.name = name
def update(self,skzt):
self.skzt=skzt
self.display()
def display(self):
print('学生:%s 知道了%s' %(self.name,self.skzt))
class teacher(observe):
def __init__(self,name):
self.name = name
def update(self,skzt):
self.skzt=skzt
self.display()
def display(self):
print('老师:%s 知道了%s' %(self.name,self.skzt))

3、创建主题父类,有三个方法,注册观察者,移除观察者和通知观察者,代码如下:
class subject:
def registerObj(self,obj):
pass
def removeObj(self,obj):
pass
def notifyObj(self):
pass

4、创建子类skl(上课啦),继承自主题类,在子类实现父类的注册观察者,移除观察者和通知观察者方法,同时创建设置上课状态方法,代码如下:
class skl(subject):
def __init__(self):
self.observers = []
self.skzt = ''
return
def registerObj(self,obj):
self.observers.append(obj)
def removeObj(self,obj):
self.observers.remove(obj)
def setSkzt(self,skzt):
self.skzt = skzt
def notifyObj(self):
for item in self.observers:
item.update(self.skzt)
return

5、在程序入口,创建一个skl类的对象,和学生类及教师类的对象。改变上课状态并写测试注册通知的代码,如下:
s1=skl()
s1.setSkzt('上课')
stu1 = student('张三')
s1.registerObj(stu1)
tec1 = teacher('王老师')
s1.registerObj(tec1)
s1.notifyObj()

6、F5运行程序,成功把上课状态通知到了学生和老师

7、测试移除观察者代码,仅需增加一行,代码如下:
s1.removeObj(stu1)

8、F5运行程序,仅把上课状态通知到了老师
