Python設計模式 責任鏈模式

2021-06-29 02:54:06 字數 3578 閱讀 4781

責任鏈模式(chain of responsibility pattern)可將請求的傳送方與處理請求的接收方解耦。這樣的話,某函式就不用直接呼叫別的函式了,而是可以把請求傳送給乙個由諸多接收者所組成的鏈條。鏈條中的首個接收者可以處理請求並停止責任鏈(也就是不再繼續往下傳遞),也可以把請求發給下乙個接收者。而第二個接收者也有這兩種選擇,此過程可一直延續至最後乙個接收者,該接收者可將請求丟棄,也可丟擲異常。

#!/usr/bin/env python

# encoding:utf-8

class

nullhandler

(object):

def__init__

(self, successor=none):

self.__successor = successor

defhandle

(self, event):

if self.__successor is

notnone:

self.__successor.handle(event)

class

concretehandler1

(nullhandler):

defhandle

(self, event):

if event > 0

and event <= 10:

print

"in handler1", event

else:

super(concretehandler1, self).handle(event)

class

concretehandler2

(nullhandler):

defhandle

(self, event):

if event > 10

and event <= 20:

print

"in handler2", event

else:

super(concretehandler2, self).handle(event)

class

concretehandler3

(nullhandler):

defhandle

(self, event):

if event > 20

and event <= 30:

print

"in handler3", event

else:

super(concretehandler3, self).handle(event)

defmain

(): handler = concretehandler3(concretehandler2(concretehandler1(nullhandler())))

events = [2, 5, 14, 22, 18, 3, 35, 27, 20]

for event in events:

handler.handle(event)

所示**在nullhandler設定乙個successor屬性,使用它來執行handle,而其他則繼承nullhandler,這樣不符合自身條件將它拋給nullhandler,讓它來執行successorhandle。我們可以從上面賦值中看出successor的順序,一開始最裡面successornone,後面是concretehandler1型別…依次類推,實現責任鏈。

關於協程

協程(coroutine)與生成器一樣,也使用yield表示式,但行為不同。協程執行的是無限迴圈,而且一開始就會停在首個(或僅有的那個)yield表示式那裡,等值有值傳給它。協程會把收到的值當成yield表示式的值,然後繼續執行它所需的操作,等處理完之後,又會再度迴圈,並在下乙個yield表示式那裡等著接收下個值。這樣的話,我們就能反覆呼叫協程中的send()throw()方法向其push值。

在python中,凡是帶有yield語句的函式或方法都能充當生成器。而利用@coroutine裝飾器及無限迴圈則可將生成器變為協程。

import functools

defcoroutine

(function):

@functools.wraps(function)

def(*args, **kwargs):

generator = function(*args, **kwargs)

next(generator)#呼叫一次生成器,令生成器物件前進到首個yield表示式。

return generator

#!/usr/bin/env python

# encoding:utf-8

@coroutine

defmouse_handler

(successor=none):

while

true:

event = (yield)

if0< event <= 10:

print("mouse-num: {}".format(event))

elif successor is

notnone:

successor.send(event)

@coroutine

defkey_handler

(successor=none):

while

true:

event = (yield)

if10< event <= 20:

print("key-num: {}".format(event))

elif successor is

notnone:

successor.send(event)

@coroutine

deftimer_handler

(successor=none):

while

true:

event = (yield)

if20< event <= 30:

print("timer-num: {}".format(event))

elif successor is

notnone:

successor.send(event)

defmain

(): pipeline = key_handler(mouse_handler(timer_handler()))

events = [2, 5, 14, 22, 18, 3, 35, 27, 20]

for event in events:

pipeline.send(event)

if __name__ == "__main__":

main()

python設計模式 責任鏈模式

學習版本3.5.2 學習版本3.5.2 在責任鏈模式中,多個不同職能的物件連線起來形成一條鏈,請求在這個鏈上傳遞,直 到鏈結上有乙個物件將請求處理完 發這個請求的客戶端並不知道鏈上的哪乙個物件最終處 理了這個請求,這可以使得系統可以在不影響客戶端的情況下動態的重新組織和分配責任 1到3類請求分別需要...

python設計模式 責任鏈模式

一 什麼是責任鏈模式 責任鏈 chain of responsibility 模式用於讓多個物件來處理單個請求 時,或者用於預先不知道應該由哪個物件 來自某個物件鏈 來處理某個特定請求時。二 責任鏈原則 三 實現 coding utf 8 class event def init self,name...

設計模式 責任鏈模式

定義 避免請求傳送者與接收者耦合在一起,讓多個物件都有可能接收請求,將這些請求連線成一條鏈,並且沿著這條鏈傳遞請求,直到有物件處理它為止。例項 請假加薪審批 using system using system.collections.generic using system.text namespa...