设计模式行为型模式

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 outif __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类讲公共动作都放在这里面,然后子类去实现具体的动作。



以上是关于设计模式行为型模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式 行为型模式 -- 访问者模式

行为型设计模式之模板方法模式

23种设计模式介绍---- 行为型模式

23种设计模式介绍---- 行为型模式

行为型设计模式:访问者模式

设计模式 行为型模式 -- 迭代器模式(定义结构实例优缺点分析)