观察者模式,和代理模式,

两种设计模式






# -*- coding: utf-8 -*-
__author__ = 'liangchao'
__date__ = '202018/7/5 14:26'

'''
MVC 思想
M -- 数据
V -- 视图
C -- 控制
下面是一种代理模式,是一种思想

设计模式:观察者模式,和代理模式
'''
class Observerd( object ): # 定义一个基类
'''
观察者基类,负责订阅通知
'''
def __init__ ( self ):
self .__observers = set () # 给他一个私有的变量,这是一个容器

def subscribe( self ,observer):
'''
观察者订阅
:param observer:
:return :
'''
self .__observers.add(observer) # 不管你 observer 是一个什么东西,反正是一个订阅的对象,我就把你放进去
def unsubscribe( self ,observer):
'''
取消订阅
:param observer:
:return :
'''
#discard 是删除容器
self .__observers.discard(observer)
# 逻辑 放基类里面做,下面所以子类继承这样的基类都有这样的基本操作了
def notify( self ,*args, **kwargs):
'''
消息的跟新通知
:param args:
:param kwargs:
:return :
'''
for observer in self .__observers:
observer.recv(*args, **kwargs)
def publish( self ,mag): # 这样一个基类的 publish 啥都不干,就是提供给你一个接口

raise NotImplementedError
# 这个 publish 就是在子类实现具体功能,当然也可以在父类里面写逻辑,但是下面的名字要改一下

class Magzine(Observerd): # 继承观察者基类
'''
杂志社
'''
def __init__ ( self ):
Observerd. __init__ ( self )

def publish( self , msg):
print ( " 杂志社有新的东西要发布!! " )
self .notify(msg) # 发布当然要通知,所以调用基类有这样的一个方法

class Student( object ): # 学生
def __init__ ( self ,name):
self .__name = name
def recv( self ,data):
print ( f" 学生 {self.__name} 收到了来自杂志的 {data} 消息 " )

class Teacher( object ):
def __init__ ( self ,name):
self .__name = name # 私有变量类自己可以用
def recv( self ,data):
print ( f" 老师 {self.__name} 收到了 {data}" )

class Manager( object ):
def __init__ ( self ):
self ._mz = Magzine()
self ._slist = []
def register( self , inst):
self ._slist.append(inst)

# def subscribe(self,*args, **kwargs):
def subscribe( self ):
# print([int for int in args])
# [self._mz.subscribe(inst) for inst in args[0]]
[ self ._mz.subscribe(inst) for inst in self ._slist]
# stu = Student()
# tc = Teacher()# 实例化这些对象
# mz = Magzine()
# mz.subscribe(stu)# 学生订阅一下
# mz.subscribe(tc)# 老师来订阅一下
#
def publish( self ,msg):
self ._mz.publish(msg) # 让代理商发布杂志社发布的消息

# 这是一种代理模式
if __name__ == "__main__" :
mg = Manager()
# st = Student()
# tc = Teacher()
mg.register(Student( "liangchao" ))
mg.register(Teacher( "chao" ))

# mg.subscribe(st, tc)
mg.subscribe()




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值