Decorator學習筆記

2022-03-23 08:38:45 字數 1410 閱讀 3021

初學者,自己的理解,請各位前輩不吝指正!

decorator,裝飾模式,設計模式之一,談談我的理解,裝飾這個詞在我概念中就是給某個事物加上一些美麗的外表,把它變得更加完美。但是裝飾是可以隨時改變的,可以拆下來換新的,換個裝飾風格也不用拆房子。而且好的裝飾,從這裡拆下來還可以在那裡用,甚至於返返工,就可以多次利用。在程式裡,引入裝飾的概念,在我淺薄的理解中,可以歸結成為抽象和封裝(這倆個概念我也不是特別懂,自己理解中應該是這樣)。

從實際應用的角度來講,就是有某一操作需要多次重用,而且這一重複操作中會巢狀各種不同核心**(其實就是為了實現這段**,可以比作房子),普通的做法就是複製貼上100遍。比如說:

1

def hit(user,boss): #

比如說是打擊boss動作2if

check(user):

3user_hit(boss)

4else:5

print

'user error'6

def buy(user,thing): #

買東西7

ifcheck(user):

8user_buy(thing)

9else:10

print

'user error'11

def sell(user,thing): #

賣東西12

ifcheck(user):

13user_sell(thing)

14else:15

print

'user error'16

.17.18 .

假如這段不能執行的**代表著某rpg裡面的各種玩家動作,按規矩,起碼在這些動作之前得確定一下是不是本人操作,這樣寫下去也沒錯,起碼所有動作寫到了,那就都能執行了,遊戲也可以玩了,但是有一句老話嘛,盡量少做重複的輪子,而check這個輪子,被重複的太多次了,而且一旦需要你寫每一步的錯誤日誌,豈不是需要再加100次寫日誌的操作?

想乙個解決辦法,把所有的操作都當成屋子,而檢查使用者當成裝飾品,具體怎麼做呢?

def checked(method):

if not check(user):

print 'user error'

else:

return method(user, *args)

@checked

def hit(user, boss):

user_hit(boss)

這個樣子一來,所有操作之前只需要加上@checked就可以了,而且加錯誤日誌只需要修改checked便可完成,玩家操作就是我們的屋子,屋子裝飾風格使用@checked來確定。裝飾風格想要變換,重寫裝飾風格即可。

學習有感

----------python小學生

(五)Decorator模式學習

decorator模式與介面卡模式 包裝器模式有點像。原有的抽象類absclassitf定義了某種介面itfx。原有的具體類conclass實現了這個介面。原有的介面itfx和其派生的功能實現成員函式都有很好的概念一致性。但是有些特殊的場合 流程下,需要對conclass的itfx實現增加一些額外的...

設計模式筆記 Decorator模式

裝飾模式,通過組合而不是繼承的方式,動態地給類增加功能的方法!這句話不好理解,邊看下圖例子邊說話吧 streams是大多數i o裝置的基礎抽象結構,它提供了將物件轉換成為位元組或字元流的操作介面,使我們可以將乙個物件轉變成乙個檔案或記憶體中的字串。乙個簡單直接的方法是定義乙個抽象的stream類,它...

設計模式學習 Decorator 裝飾

意圖 動態的為乙個物件新增一些額外的職責,decorator比子類更加靈活 示例圖 適用性 在不影響物件的情況下,以動態,透明的方式給單個物件新增職責 處理那些可以撤銷的職責 但不能使用子類進行擴充時 類被隱藏 類定義不能生成子類 注意事項 裝飾物件的介面必須與它所裝飾的component的介面一致...