观察者模式

作者: nummycode | 来源:发表于2017-07-06 15:54 被阅读7次

观察者模式(有时又被称为发布(publish-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。

观察者模式中包含以下几种对象类型:

  • 观察者(Observer):观察者将自己注册到被观察对象中,被观察对象将观察者存放在一个容器(Container)里。
  • 被观察对象(Subject):被观察对象发生了某种变化,从容器中得到所有注册过的观察者,将变化通知观察者。

示例

# coding:utf-8
import weakref

class Subject(object):
    """被观察对象,使用列表存储所有观察者"""
    def __init__(self, name):
        """此处使用弱引用,当删除observer是,WeakSet也会自动删除对应对象"""
        self.name = name
        self._observers = weakref.WeakSet()


    def register_observer(self, observer):
        """订阅事件,相当于将观察者添加到列表中"""
        self._observers.add(observer)
        print "observer {0} now listening on {1}".format(observer.name, self.name)


    def notify_observers(self, msg):
        """遍历列表,发送消息给每一个观察者"""
        print("subject notifying observers about {}".format(msg,))
        for observer in self._observers:
            observer.notify(self, msg)


class Observer(object):
    def __init__(self, name):
        self.name = name

    def start_observing(self, subject):
        """订阅事件"""
        subject.register_observer(self)


    def notify(self, subject, msg):
        """通知观察者"""
        print "{0} get msg from {1} that {2}".format(self.name, subject.name, msg)

class_homework = Subject("class homework")
student1 = Observer("student 1")
student2 = Observer("student 2")

student1.start_observing(class_homework)
student2.start_observing(class_homework)

class_homework.notify_observers("result if out")
del student1
class_homework.notify_observers("20/20 passed this exam")

输出结果为:

observer student 1 now listening on class homework
observer student 2 now listening on class homework
subject notifying observers about result if out
student 1 get msg from class homework that result if out
student 2 get msg from class homework that result if out
subject notifying observers about 20/20 passed this exam
student 2 get msg from class homework that 20/20 passed this exam

相关文章

  • 11.9设计模式-观察者模式-详解

    设计模式-观察者模式 观察者模式详解 观察者模式在android中的实际运用 1.观察者模式详解 2.观察者模式在...

  • RxJava基础—观察者模式

    设计模式-观察者模式 观察者模式:观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式...

  • 前端面试考点之手写系列

    1、观察者模式 观察者模式(基于发布订阅模式) 有观察者,也有被观察者。 观察者需要放到被观察者列表中,被观察者的...

  • RxJava 原理篇

    一、框架思想 观察者模式观察者自下而上注入被观察者被观察者自上而下发射事件观察者模式 装饰器模式自上而下,被观察者...

  • 观察者模式

    观察者模式概念 观察者模式是对象的行为模式,又叫作发布-订阅(publish/subscrible)模式。 观察者...

  • 设计模式-观察者模式

    观察者模式介绍 观察者模式定义 观察者模式(又被称为发布-订阅(Publish/Subscribe)模式,属于行为...

  • 观察者模式

    观察者模式 观察者模式的定义 观察者模式(Observer Pattern)也叫做发布订阅模式(Publish/s...

  • iOS设计模式之观察者模式

    观察者模式 1、什么是观察者模式 观察者模式有时又被称为发布(publish)-订阅(Subscribe)模式、模...

  • 观察者模式和发布订阅模式区别

    观察者模式 所谓观察者模式,其实就是为了实现松耦合(loosely coupled)。 在观察者模式中,观察者需要...

  • RxJava(二)

    一、观察者模式 1.1、传统的观察者模式 1.2、RxJava 的观察者模式 区别传统的观察者模式是一个 Obse...

网友评论

    本文标题:观察者模式

    本文链接:https://www.haomeiwen.com/subject/utihhxtx.html