初學者,本身的理解,請各位前輩不吝指正!html
Decorator,裝飾模式,設計模式之一,談談個人理解,裝飾這個詞在我概念中就是給某個事物加上一些美麗的外表,把它變得更加完美。可是裝飾是能夠隨時改變的,能夠拆下來換新的,換個裝飾風格也不用拆房子。並且好的裝飾,從這裏拆下來還能夠在那裏用,甚至於返返工,就能夠屢次利用。在程序裏,引入裝飾的概念,在我淺薄的理解中,能夠歸結成爲抽象和封裝(這倆個概念我也不是特別懂,本身理解中應該是這樣)。python
從實際應用的角度來說,就是有某一操做須要屢次重用,並且這一重複操做中會嵌套各類不一樣核心代碼(其實就是爲了實現這段代碼,能夠比做房子),普通的作法就是複製粘貼100遍。好比說:設計模式
1 def hit(user,boss): #好比說是打擊boss動做 2 if check(user): 3 user_hit(boss) 4 else: 5 print 'user error' 6 def buy(user,thing): #買東西 7 if check(user): 8 user_buy(thing) 9 else: 10 print 'user error' 11 def sell(user,thing): #賣東西 12 if check(user): 13 user_sell(thing) 14 else: 15 print 'user error' 16 . 17 . 18 .
假如這段不能運行的代碼表明着某RPG裏面的各類玩家動做,按規矩,起碼在這些動做以前得肯定一下是否是本人操做,這樣寫下去也沒錯,起碼全部動做寫到了,那就都能執行了,遊戲也能夠玩了,可是有一句老話嘛,儘可能少作重複的輪子,而check這個輪子,被重複的太屢次了,並且一旦須要你寫每一步的錯誤日誌,豈不是須要再加100次寫日誌的操做?app
想一個解決辦法,把全部的操做都當成屋子,而檢查用戶當成裝飾品,具體怎麼作呢?學習
def checked(method): def wrapper(user, *args): if not check(user): print 'user error' else: return method(user, *args) return wrapper @checked def hit(user, boss): user_hit(boss)
這個樣子一來,全部操做以前只須要加上@checked就能夠了,並且加錯誤日誌只須要修改checked即可完成,玩家操做就是咱們的屋子,屋子裝飾風格使用@checked來肯定。裝飾風格想要變換,重寫裝飾風格便可。spa
學習http://www.cnblogs.com/SeasonLee/articles/1719444.html有感設計
----------python小學生日誌