设计模式行为型模式
Posted pythonAndLeetcode
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式行为型模式相关的知识,希望对你有一定的参考价值。
行为型设计模式一共有11个
一、观察者模式
观察者模式其实就是监工,当工人的信息发生变化的时候,需要主动告诉见监工,然后监工发通告告诉所有的工人。有一种简单的应用模式就是微博的推模式和订阅模式
class ObserverBase(object):
'''观察者基类''' #放哨者
def __init__(self):
self._observerd_list = [] #被通知对象
def attach(self,observe_subject):
'''
添加要观察的对象
:param observe_subject:
:return:
'''
if observe_subject not in self._observerd_list:
self._observerd_list.append(observe_subject)
print("[%s]已经将[%s]加入观察队列..."%(self.name,observe_subject) )
def detach(self,observe_subject):
'''
解除观察关系
:param observe_subject:
:return:
'''
try:
self._observerd_list.remove(observe_subject)
print("不再观察[%s]" %observe_subject)
except ValueError:
pass
def notify(self):
'''
通知所有被观察者
:return:
'''
for objserver in self._observerd_list:
objserver.update(self)
class Observer(ObserverBase):
'''观察者类'''
def __init__(self,name):
super(Observer,self).__init__()
self.name = name
self._msg = ''
@property #外部执行d.eat 去掉括号
def msg(self):
'''
当前状况
:return:
'''
return self._msg
@msg.setter #设置属性(一个方法变成一个静态的属性)
def msg(self,content):
self._msg = content
self.notify()
#目前结论:一个方法变成一个静态的属性 (装饰了@property)
#通过另外一个相同名字的方法(装饰@msg.setter )进行修改该属性
#简单:d = Observer('xxx')
#print(d.msg) 结果:空
#d.msg = 'xxx'
# #这种形式调用该对象有装饰setter的方法,xxx作为形参
#print(d.msg) 结果:xxx
class GCDViewer(object):
'''
共军被观察者
'''
def update(self,observer_subject):
print("共军:收到[%s]消息[%s] "%(observer_subject.name,observer_subject.msg) )
class GMDViewer(object):
'''
国军被观察者
'''
def update(self,observer_subject):
print("国军:收到[%s]消息[%s] "%(observer_subject.name,observer_subject.msg) )
if __name__ == "__main__":
observer1 = Observer("共军放哨者")
observer2 = Observer("国军放哨者")
gongjun1 = GCDViewer()
guojun1 = GMDViewer()
observer1.attach(gongjun1)
observer1.attach(guojun1)
observer2.attach(guojun1)
observer1.msg = "\033[32;1m敌人来了...\033[0m"
observer2.msg ="\033[31;1m前方发现敌人,请紧急撤离,不要告诉共军\033[0m
二、状态模式
状态模式就是根据自身的状态会给出不同的应答,就比如媳妇高兴的时候,你可以作一下没事,但是媳妇不高兴的时候,你要是作,那可真是要倒霉的。
class State(object):
"""Base state. This is to share functionality"""
def scan(self):
"""Scan the dial to the next station"""
self.pos += 1
if self.pos == len(self.stations):
self.pos = 0
print("Scanning... Station is", self.stations[self.pos], self.name)
class AmState(State):
def __init__(self, radio):
self.radio = radio
self.stations = ["1250", "1380", "1510"]
self.pos = 0
self.name = "AM"
def toggle_amfm(self):
print("Switching to FM")
self.radio.state = self.radio.fmstate
class FmState(State):
def __init__(self, radio):
self.radio = radio
self.stations = ["81.3", "89.1", "103.9"]
self.pos = 0
self.name = "FM"
def toggle_amfm(self):
print("Switching to AM")
self.radio.state = self.radio.amstate
class Radio(object):
"""A radio. It has a scan button, and an AM/FM toggle switch."""
def __init__(self):
"""We have an AM state and an FM state"""
self.amstate = AmState(self)
self.fmstate = FmState(self)
self.state = self.amstate
def toggle_amfm(self):
self.state.toggle_amfm()
def scan(self):
self.state.scan()
# Test our radio out
if __name__ == '__main__':
radio = Radio()
actions = [radio.scan] * 2 + [radio.toggle_amfm] + [radio.scan] * 2
actions = actions * 2
for action in actions:
action()
三、策略模式
这个模式下,首先你要定制不同情况下需要做的事情,然后实例根据不同的情况执行策略。
四、责任链模式
这个模式就比较类似是公司OA审批,100W款项的项目可以让项目经理自己审批,1000W的项目就只能分公司经理审批。这个样子。需要有一个入口实例,然后入口把信息按照流水线的形式推给每一个节点的领导去审批。
五、命令模式
这个模式就类似与操作数据库,你发送命令,他干事,可以回退。自己想一下数据库的各个方法实现就可以了。这个主要体现就是数据库的类。
六、访问者模式
根据不同的访问者,给出不同的应答。这里就好比不同的病人去找同一个医生看病,给出的病历单和开的药肯定是不一样的。
七、调停模式
调停模式这个就好比是爬虫的scrapy的调度中心,由中心进行分配任务,每一个实例请求都会到调度中心,调度中心去决定谁来做。
八、备忘录模式
备忘录模式在我看来就是,每当实例要改变状态的时候,需要把前一个状态保存下来。
九、迭代器模式
迭代器模式其实也挺简单的,就是一个列表[new1,new2,new3,new4]这样一个实例列表,可以自主选择迭代几次。
十、解释器模式
这个模式解释起来也非常简单,python解释器就是这个道理,我们人写的python代码机器是不认识的,但是通过python解释器可以转化为机器认识的代码,去执行动作。
十一、模板模式
模板模式简单的说就是继承,写要给base类讲公共动作都放在这里面,然后子类去实现具体的动作。
以上是关于设计模式行为型模式的主要内容,如果未能解决你的问题,请参考以下文章