python实现观察者模式_观察者模式_20190912(python)

一、观察者模式介绍

image.png

二、观察者模式UML

image.png

三、python实现观察者模式(demo1、2)

1、demo1

"""

"""

观察者模式

"""

class Subject(object):

def init(self):

self.__observers = []

def register(self, observer):

self.__observers.append(observer)

def notifyAll(self, *args, **kwargs):

for observer in self.__observers:

observer.notify(self, *args, **kwargs)

class Observer1(object):

def init(self, subject):

subject.register(self)

def notify(self, subject, *args):

print(type(self).__name__, ":: Got", args, "From", subject)

class Observer2(object):

def init(self, subject):

subject.register(self)

def notify(self, subject, *args):

print(type(self).__name__, ":: Got", args, "From", subject)

if name == "main":

subject = Subject()

observer1 = Observer1(subject)

observer2 = Observer2(subject)

subject.notifyAll('notification')

"""

2、demo2

"""

"""

观察者模式:新闻内容订阅和通知

"""

from abc import ABCMeta, abstractmethod

subject

class NewsPublisher(object):

def init(self):

self.__subscribers = []

self.__latestNews = None

def attach(self, subscriber):

self.__subscribers.append(subscriber)

def detach(self):

return self.__subscribers.pop()

def get_subscribers(self):

return [type(x).__name__ for x in self.__subscribers]

def notifySubscribers(self):

for sub in self.__subscribers:

sub.update()

def addNews(self, news):

self.__latestNews = news

def getNews(self):

return "Got News: ", self.__latestNews

observer

class Subscriber(metaclass=ABCMeta):

@abstractmethod

def update(self):

pass

class SMSSubscriber(Subscriber):

def init(self, publisher):

self.publisher = publisher

self.publisher.attach(self)

def update(self):

print(type(self).__name__, self.publisher.getNews())

class EmailSubscriber(Subscriber):

def init(self, publisher):

self.publisher = publisher

self.publisher.attach(self)

def update(self):

print(type(self).__name__, self.publisher.getNews())

class OtherSubscriber(Subscriber):

def init(self, publisher):

self.publisher = publisher

self.publisher.attach(self)

def update(self):

print(type(self).__name__, self.publisher.getNews())

client

if name == "main":

news_publisher = NewsPublisher()

for subscriber in [SMSSubscriber, EmailSubscriber, OtherSubscriber]:

subscriber(news_publisher)

print("\n Subscribers: ", news_publisher.get_subscribers())

news_publisher.addNews("Hello world! ")

news_publisher.notifySubscribers()

print("\n Detached: ", type(news_publisher.detach()).__name__)

print("\n Subscribers: ", news_publisher.get_subscribers())

news_publisher.addNews("Second News! ")

news_publisher.notifySubscribers()

"""

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值