觀察者模式

觀察者模式(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.......

留言