网络编程
位置:首页>> 网络编程>> Python编程>> Python程序中的观察者模式结构编写示例

Python程序中的观察者模式结构编写示例

作者:newbie_evolve  发布时间:2022-08-04 22:12:11 

标签:Python,观察者模式

察者模式定义
定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖都会收到通知并自动更新。观察者模式提供了一种对象设计,让主题和观察者之间松耦合。
设计原则
为了交互对象之间的松耦合设计而努力。松耦合的设计之所以能让我们建立有弹性的系统,能够应对变化,是因为对象之间的互相依赖降到了最低。

模式结构与说明

Python程序中的观察者模式结构编写示例

1.Subject:主题(目标)接口,主题可以注册、移除对其感兴趣的观察者,在自身数据发生变化的时候,还可以通知这些观察者。一个主题可以有多个观察者,需要注意的是,观察者的顺序应当是无关紧要的。主题也被称为“被观察者”(Observable)
2.所有的观察者必须实现Observer接口,以便主题状态发生变化时,可以被通知
观察者模式是一种广泛使用、非常重要的设计模式,它有利于降低对象间的耦合,同时让对象保持高度协作。该模式的松耦合特性体现在:
1.关于观察者的一切,主题只知道它实现了观察者接口,其它一概不知
2.在任何时候,主题的观察者可以被动态的添加、删除
3.当新类型的观察者出现时,主题的代码不需要进行修改
4.修改主题或者观察者的任一方,对方不会受到影响

示例
通过注释就可以清晰理解~


#observer pattern

class subject():
 def __init__(self,dat):
   self.listobj = list() #主题中的列表变量用来存储观察者
   self.dat = dat #主题中的数据变化时,需要通知观察者

def registerObject(self,obj):
   self.listobj.append(obj) #实现订阅主题的函数

def removeObject(self,obj):
   pass

def notifyObservers(self):#通知各个观察者数据已经发生变化,观察者相应需要更新自己的数据
   for i in range(len(self.listobj)):
     self.listobj[i].update()

def setdat(self,new_dat):#设置数据
   if self.dat != new_dat:
     self.dat = new_dat
     self.notifyObservers()

class observer():#观察者
 def __init__(self,sub): #观察者初始化时,需要订阅主题
   self.sub = sub
   self.sub.registerObject(self)
   self.number = self.sub.dat

def update(self):#观察者更新
   self.number = self.sub.dat
 def display(self):
   print self.number

if __name__ =="__main__":
 su = subject(10)
 ob1 = observer(su)
 ob1.display()
 ob2 = observer(su)
 ob2.display()
 su.setdat(11)
 ob1.display()
 ob2.display()

   

0
投稿

猜你喜欢

  • 本文实例讲述了Python对切片命名清除索引的方法。分享给大家供大家参考,具体如下:问题:如何清理掉到处都是硬编码的切片索引解决方案:对切片
  • 用XMlhttp生成html页面,相关函数如下:<%  ’定义xmlhttp  function Get
  • 上次 li 把 dl 模拟了~dl不知道要干什么了:green:~找了ol一起来做复合列表~:这个练习除了css外~外加用了点JS :shi
  • Douglas Crockford是JavaScript开发社区最知名的权威,是JSON、JSLint、JSMin和ADSafe之父,是《J
  • 使用WSH调用系统的Ping命令,将Ping的结果重定向到一个文本文件中去,再把文本文件显示到网页中具体做法如下:首先, 建一个.BAT文件
  • time 模块主要包含各种提供日期、时间功能的类和函数。该模块既提供了把日期、时间格式化为字符串的功能,也提供了从字符串恢复日期、时间的功能
  • 本文实例讲述了PHP实现数组根据某个字段进行水平合并,横向合并。分享给大家供大家参考,具体如下:PHP数组水平合并,横向合并,两条数据合并成
  • 一、什么是函数装饰器1.函数装饰器是Python提供的一种增强函数功能的标记函数;2.装饰器是可调用的函数对象,其参数是另一个函数(被装饰的
  • 阅读上一篇:javascript 45种缓动效果(一)这部分对原先的缓动函数进行抽象化,并结合缓动公式进行强化。成品的效果非常惊人逆天。走过
  • 相关验证码文章:asp制作验证码的方法 轩魂ASP中文验证码下载 先产生一个4位数的随机码源代码:ychar="0,1,2,3,4
  • 在IE7还不支持counter 和increment 属性之前,我从来没有用过它们,也从来没有使用过:before 伪元素和content
  • 购物车的设计目标 从程序员的观点来看,购物车是维护购物者商品选购、允许察看、允许修改的一个对象。购物车本身是一个非常简单的程序,但开发者要考
  • SQL Server数据库查询速度慢的原因有很多,常见的有以下几种:1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)
  • 本文实例讲述了PHP缓存集成库phpFastCache用法。分享给大家供大家参考。具体分析如下:phpFastCache是一个开源的PHP缓
  • 总的来说视觉设计是一个很大的范畴,囊括了我们身边很多产品的再创作设计,比如工业产品设计,广告设计,新媒体设计,服饰设计,还有我们这里要讨论的
  • 我想把本篇作为css基础教程的序曲,从今天开始翻译和整理我从设计网页以来所学到的css基础知识。本教程会分成N个部分,单独发表,其间可能会插
  • 本文实例讲述了Python基于回溯法子集树模板解决野人与传教士问题。分享给大家供大家参考,具体如下:问题在河的左岸有N个传教士、N个野人和一
  • 1:除非你现在已经过了不惑之年了,否则你就一定要保持年轻人特有的激情!这里的激情,包含了那种说不明白的近似于冲动的东西,或者idea。也包含
  • 刚开始进入页面,当滚动向下超过原屏的时候。右侧会出现一个“返回顶部”的按钮。这个按钮会跟这网页一起向上向下,当滚动到顶部的时候。“返回顶部”
  •  一直以来,每次调用Ajax方法都需要创建一次 Microsoft.XMLHTTP 对象,今天在使用Ajax技术做一个类似聊天室的
手机版 网络编程 asp之家 www.aspxhome.com