責任鏈模式(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
,讓它來執行successor
的handle
。我們可以從上面賦值中看出successor
的順序,一開始最裡面successor
為none
,後面是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...