初学者,本身的理解,请各位前辈不吝指正!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小学生日志