【编程思想】【设计模式】【行为模式Behavioral】观察者模式Observer
Python转载版
https://github.com/faif/python-patterns/blob/master/behavioral/observer.py
#!/usr/bin/env python
# -*- coding: utf-8 -*- """
http://code.activestate.com/recipes/131499-observer-pattern/ *TL;DR80
Maintains a list of dependents and notifies them of any state changes.
""" from __future__ import print_function class Subject(object): def __init__(self):
self._observers = [] def attach(self, observer):
if observer not in self._observers:
self._observers.append(observer) def detach(self, observer):
try:
self._observers.remove(observer)
except ValueError:
pass def notify(self, modifier=None):
for observer in self._observers:
if modifier != observer:
observer.update(self) # Example usage
class Data(Subject): def __init__(self, name=''):
Subject.__init__(self)
self.name = name
self._data = 0 @property
def data(self):
return self._data @data.setter
def data(self, value):
self._data = value
self.notify() class HexViewer: def update(self, subject):
print(u'HexViewer: Subject %s has data 0x%x' %
(subject.name, subject.data)) class DecimalViewer: def update(self, subject):
print(u'DecimalViewer: Subject %s has data %d' %
(subject.name, subject.data)) # Example usage...
def main():
data1 = Data('Data 1')
data2 = Data('Data 2')
view1 = DecimalViewer()
view2 = HexViewer()
data1.attach(view1)
data1.attach(view2)
data2.attach(view2)
data2.attach(view1) print(u"Setting Data 1 = 10")
data1.data = 10
print(u"Setting Data 2 = 15")
data2.data = 15
print(u"Setting Data 1 = 3")
data1.data = 3
print(u"Setting Data 2 = 5")
data2.data = 5
print(u"Detach HexViewer from data1 and data2.")
data1.detach(view2)
data2.detach(view2)
print(u"Setting Data 1 = 10")
data1.data = 10
print(u"Setting Data 2 = 15")
data2.data = 15 if __name__ == '__main__':
main() ### OUTPUT ###
# Setting Data 1 = 10
# DecimalViewer: Subject Data 1 has data 10
# HexViewer: Subject Data 1 has data 0xa
# Setting Data 2 = 15
# HexViewer: Subject Data 2 has data 0xf
# DecimalViewer: Subject Data 2 has data 15
# Setting Data 1 = 3
# DecimalViewer: Subject Data 1 has data 3
# HexViewer: Subject Data 1 has data 0x3
# Setting Data 2 = 5
# HexViewer: Subject Data 2 has data 0x5
# DecimalViewer: Subject Data 2 has data 5
# Detach HexViewer from data1 and data2.
# Setting Data 1 = 10
# DecimalViewer: Subject Data 1 has data 10
# Setting Data 2 = 15
# DecimalViewer: Subject Data 2 has data 15
Python转载版
【编程思想】【设计模式】【行为模式Behavioral】观察者模式Observer的更多相关文章
- [Android&Java]浅谈设计模式-代码篇:观察者模式Observer
观察者,就如同一个人,对非常多东西都感兴趣,就好像音乐.电子产品.Game.股票等,这些东西的变化都能引起爱好者们的注意并时刻关注他们.在代码中.我们也有这种一种方式来设计一些好玩的思想来.今天就写个 ...
- 设计模式----行为型模式之观察者模式(Observer Pattern)
下面是阅读<Head First设计模式>的笔记. 观察者模式 定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新. JDK API内置机制 ...
- 编程模式之观察者模式(Observer)
观察者模式由四个角色组成:抽象主题角色,抽象观察者角色,具体主题角色,抽象观察者角色,具体观察者角色. 抽象主题角色(Subject):把所有的观察者角色的引用保存在一个集合中,可以有任意数量的观察者 ...
- 十一个行为模式之观察者模式(Observer Pattern)
定义: 定义对象之间一种一对多的关系,当被观察者状态变化时,可以自动地通知观察者并执行相关的业务操作.观察者模式又被称为发布-订阅模式等. 结构图: Subject:抽象主题类,定义了所有被观察类的通 ...
- 设计模式之十:观察者模式(Observer)
观察者模式: 在对象之间定义了一种一对多的依赖关系.当一个对象改变它的状态时,全部依赖它的对象会自己主动接收通知并更新自己的状态. Define a one-to-many dependency be ...
- HeadFirst设计模式读书笔记(2)-观察者模式(Observer Pattern)
观察者模式:定义了对象之间一对多的依赖关系,这样一来,当一个对象的状态发生改变时,它的依赖者将会受到通知并且自动更新. 有一个模式可以帮你的对象知悉现况,不会错过该对象感兴趣的事,对象甚至在运行时可以 ...
- Headfirst设计模式的C++实现——观察者模式(Observer)
WeatherData.h #ifndef WEATHERDATA_H_INCLUDED #define WEATHERDATA_H_INCLUDED #include <set> #in ...
- 面向对象编程思想(前传)--你必须知道的javascript
在写面向对象编程思想-设计模式中的js部分的时候发现很多基础知识不了解的话,是很难真正理解和读懂js面向对象的代码.为此,在这里先快速补上.然后继续我们的面向对象编程思想-设计模式. 什么是鸭子类型 ...
- 面向对象编程思想(前传)--你必须知道的javascript(转载)
原文地址:http://www.cnblogs.com/zhaopei/p/6623460.html阅读目录 什么是鸭子类型 javascript的面向对象 封装 继承 多态 原型 this指向 ...
- 观察者模式 Observer 发布订阅模式 源 监听 行为型 设计模式(二十三)
观察者模式 Observer 意图 定义对象一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖他的对象都得到通知并自动更新. 别名:依赖(Dependents),发布订阅(Publish-Su ...
随机推荐
- 『学了就忘』Linux基础命令 — 32、压缩和解压缩相关命令
目录 1.".zip"格式压缩 2.".gz"格式压缩 3.".bz2"格式压缩 4.".tar"格式打包 5.打包和压 ...
- 一维前缀和 连续数组和为k
给定一个整数数组和一个整数 k ,请找到该数组中和为 k 的连续子数组的个数. 滑动窗口没办法解决有负数的情况 方法一: 预处理 前缀和 sum_ij = preSum[j] - preSum[i-1 ...
- 暑假算法练习Day3
第三天!!!最近要开始归纳总结Python学习啦!! 1006 换个格式输出整数 (15 分) 让我们用字母 B 来表示"百".字母 S 表示"十",用 12. ...
- vue3 学习笔记 (二)——axios 的使用有变化吗?
本篇文章主要目的就是想告诉我身边,正在学 vue3 或者 准备学 vue3 的同学,vue3中网络请求axios该如何使用,防止接触了一点点 vue3 的同学会有个疑问?生命周期.router .vu ...
- Python 函数常用类型
函数常用类型 无参数,无返回值 无参数,有返回值 有参数,无返回值 有参数,有返回值2.无参数,无返回值 无参数无返回值 def hello(): ...
- CSS学习笔记:grid布局
目录 一.Grid布局简介 二.Grid布局的一些概念 三. 容器元素属性 1. grid-template-* 1.1 网格行和列的设置 1.2 repeat的使用 1.3 使用fr 1.4 aut ...
- 如何提高C# StringBuilder的性能
本文探讨使用C# StringBuilder 的最佳实践,用于减少内存分配,提高字符串操作的性能. 在 .NET 中,字符串是不可变的类型.每当你在 .NET 中修改一个字符串对象时,就会在内存中创建 ...
- 通过python来获取网页状态
#!/usr/bin/python import sys,httplibfrom optparse import OptionParserusageString = "Usage: %pro ...
- python实现高斯图像金字塔
一,定义 图像金字塔:同一图像的不同分辨率的子图集合,其生成方式有向上取样和向下取样.向下取样是从G0采样形成分辨率较低的G1,G1再采样形成分辨率较低的G2......,就构成了一个金字塔.向下取样 ...
- 快速从零开始整合SSM,小白包会(1)
整合SSM,关键就是几个xml的配置. 准备: 1. Idea(配置好tomcat,可以安装插件freeMybatis,提高效率,安装插件不难,百度经验就有) 2. 下载好数据库MySql,以 ...