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

两种设计模式






# -*- 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、付费专栏及课程。

余额充值