觀察者模式
觀察者模式(Observer Pattern) oo 設計
可以練習 封裝 繼承 多形
這裡以報社 和 客戶為例子 分別繼承 主題和觀察者
本文參考 : https://dotblogs.com.tw/joysdw12/archive/2013/03/13/96531.aspx 並轉為 python
class Isubject(object):
def __init__(self):
self.IObserver = IObserver()
RegisterObserver(IObserver)
class IObserver(object):
def __init__(self, name):
self.name = name
def Update(self, pMessage):
self.pMessage = pMessage
class NewspaperOffice(Isubject):
def __init__(self):
self.List = []
self.pObserver = IObserver(self)
def RegisterObserver(self, pObserver):
self.List.append(pObserver)
def RemoveObserver(self, pObserver):
for i in self.List:
if i.name == pObserver.name:
self.List.remove(i)
def printRegister(self):
for i in self.List:
print i.name
def notifyObservers(self, pContent):
for observer in self.List:
observer.Update(pContent);
def SendNewspaper(self, pContent):
print "Office send news..."
self.notifyObservers(pContent);
class Customer(IObserver):
def Update(self, pMessage):
print "\treceive a new message: %s %s" % (self.name, pMessage)
office = NewspaperOffice();
# Jason want to sub
Jason = Customer("Jason")
office.RegisterObserver(Jason);
# Jack want to sub
jack = Customer("Jack");
office.RegisterObserver(jack);
# office send first news
office.SendNewspaper("News One.......");
# Jason don't want to sub
office.RemoveObserver(Jason);
# office send second news
office.SendNewspaper("News Two.......");
Office send news...
receive a new message: Jason News One.......
receive a new message: Jack News One.......
Office send news...
receive a new message: Jack News Two.......
可以練習 封裝 繼承 多形
這裡以報社 和 客戶為例子 分別繼承 主題和觀察者
本文參考 : https://dotblogs.com.tw/joysdw12/archive/2013/03/13/96531.aspx 並轉為 python
class Isubject(object):
def __init__(self):
self.IObserver = IObserver()
RegisterObserver(IObserver)
class IObserver(object):
def __init__(self, name):
self.name = name
def Update(self, pMessage):
self.pMessage = pMessage
class NewspaperOffice(Isubject):
def __init__(self):
self.List = []
self.pObserver = IObserver(self)
def RegisterObserver(self, pObserver):
self.List.append(pObserver)
def RemoveObserver(self, pObserver):
for i in self.List:
if i.name == pObserver.name:
self.List.remove(i)
def printRegister(self):
for i in self.List:
print i.name
def notifyObservers(self, pContent):
for observer in self.List:
observer.Update(pContent);
def SendNewspaper(self, pContent):
print "Office send news..."
self.notifyObservers(pContent);
class Customer(IObserver):
def Update(self, pMessage):
print "\treceive a new message: %s %s" % (self.name, pMessage)
office = NewspaperOffice();
# Jason want to sub
Jason = Customer("Jason")
office.RegisterObserver(Jason);
# Jack want to sub
jack = Customer("Jack");
office.RegisterObserver(jack);
# office send first news
office.SendNewspaper("News One.......");
# Jason don't want to sub
office.RemoveObserver(Jason);
# office send second news
office.SendNewspaper("News Two.......");
Office send news...
receive a new message: Jason News One.......
receive a new message: Jack News One.......
Office send news...
receive a new message: Jack News Two.......
留言
張貼留言