两种设计模式
# -*- 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()