Decorator学习笔记
初学者,自己的理解,请各位前辈不吝指正!
Decorator,装饰模式,设计模式之一,谈谈我的理解,装饰这个词在我概念中就是给某个事物加上一些美丽的外表,把它变得更加完美。但是装饰是可以随时改变的,可以拆下来换新的,换个装饰风格也不用拆房子。而且好的装饰,从这里拆下来还可以在那里用,甚至于返返工,就可以多次利用。在程序里,引入装饰的概念,在我浅薄的理解中,可以归结成为抽象和封装(这俩个概念我也不是特别懂,自己理解中应该是这样)。
从实际应用的角度来讲,就是有某一操作需要多次重用,而且这一重复操作中会嵌套各种不同核心代码(其实就是为了实现这段代码,可以比作房子),普通的做法就是复制粘贴100遍。比如说:
def hit(user,boss): #比如说是打击boss动作
if check(user):
user_hit(boss)
else:
print 'user error'
def buy(user,thing): #买东西
if check(user):
user_buy(thing)
else:
print 'user error'
def sell(user,thing): #卖东西
if check(user):
user_sell(thing)
else:
print 'user error'
.
.
.
假如这段不能运行的代码代表着某RPG里面的各种玩家动作,按规矩,起码在这些动作之前得确定一下是不是本人操作,这样写下去也没错,起码所有动作写到了,那就都能执行了,游戏也可以玩了,但是有一句老话嘛,尽量少做重复的轮子,而check这个轮子,被重复的太多次了,而且一旦需要你写每一步的错误日志,岂不是需要再加100次写日志的操作?
想一个解决办法,把所有的操作都当成屋子,而检查用户当成装饰品,具体怎么做呢?
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来确定。装饰风格想要变换,重写装饰风格即可。
学习http://www.cnblogs.com/SeasonLee/articles/1719444.html有感
----------python小学生
Decorator学习笔记的更多相关文章
- [学习笔记]设计模式之Decorator
写在前面 为方便读者,本文已添加至索引: 设计模式 学习笔记索引 Decorator(装饰)模式,可以动态地给一个对象添加一些额外的职能.为了更好地理解这个模式,我们将时间线拉回Bridge模式笔记的 ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
- 《Node.js开发实战详解》学习笔记
<Node.js开发实战详解>学习笔记 ——持续更新中 一.NodeJS设计模式 1 . 单例模式 顾名思义,单例就是保证一个类只有一个实例,实现的方法是,先判断实例是否存在,如果存在则直 ...
- [学习笔记]设计模式之Proxy
为方便读者,本文已添加至索引: 设计模式 学习笔记索引 写在前面 “魔镜啊魔镜,谁是这个世界上最美丽的人?” 每到晚上,女王都会问魔镜相同的问题(见Decorator模式).这是她还曾身为女巫时留下的 ...
- Java学习笔记4
Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...
- Python学习笔记012——装饰器
1 装饰器 1.1装饰器定义 在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator). 1.2 装饰器分类 装饰器:函数装饰器,类装饰器,函数的装饰器,类的装饰器 装饰器:函数装饰函 ...
- 23 DesignPatterns学习笔记:C++语言实现 --- 1.4 Builder
23 DesignPatterns学习笔记:C++语言实现 --- 1.4 Builder 2016-07-21 (www.cnblogs.com/icmzn) 模式理解
- 23 DesignPatterns学习笔记:C++语言实现
DesignPatterns学习笔记:C++语言实现 (转载请注明出处:http://www.cnblogs.com/icmzn/p/5680784.html) 1. 创建型设计模式: (1)Faco ...
- 设计模式学习笔记——java中常用的设计模式
单例设计模式(Singleton Pattern) 观察者模式(Observer Pattern) 工厂模式(Factory Pattern) 策略模式(Strategy Pattern) 适配器模式 ...
随机推荐
- @property属性关键字
关于@property属性关键字使用注意:* weak(assign) : 代理\UI控件* strong(retain) : 其他对象(除代理\UI控件\字符串以外的对象)* copy : 字符串 ...
- [nagios监控] NRPE: Unable to read output 的原因及排除
nrpe被监控端运行定义命令正常,监控端运行 #/usr/local/nagios/libexec/check_nrpe -H 117.121.9.200 -c check_oracle_tables ...
- 最新的四款国外VPN,免费稳定,可以看国外网站的
tyle="margin-top:20px; margin-right:0px; margin-bottom:0px; margin-left:0px; font-family:Arial; ...
- [Angular 2] Simple intro Http
To use http, we need to import the HTTP_PROVIDER, so that we can inject http to other component: imp ...
- 在ViewController中View的生命周期
view的生命周期如下(按顺序) -(void)loadView 用代码初始化的时候,第一个调用该方法.可以在这里面addSubView. -(void)viewDidLoad 初始化时一些数据的设置 ...
- 用GDB调试多进程程序
在子进程中sleep.然后attach上去. gdb --pid=123456 ps出子进程的id,gdb attach 进程号. http://www.ibm.com/developerworks/ ...
- ContextLoaderListener初始化的前后文和DispatcherServlet初始化的上下文关系
ContextLoaderListener初始化的上下文加载的Bean是对于整个应用程序共享的,不管是使用什么表现层技术,一般如DAO层.Service层Bean: DispatcherServlet ...
- Http协议学习小结
1.Http基本概述: HTTP(hypertext transport protocol),即超文本传输协议.这个协议详细规定了浏览器和万维网服务器之间互相通信的规则. HTTP就是一个通信规则,通 ...
- fstab的格式
# /etc/fstab/dev/hda8 swap swap defaults 0 0/dev/hda9 / ext2 defaults 1 1/dev/hda6 /wine vfat defaul ...
- extJs项目实战
extjs是因为在公司用到一次,也是公司唯一一个extjs的项目,当时拿到这个需求的时候,我有点懵逼,这他妈的什么鬼,参加工作两年不到的纯小白,没办法,这是工作,必须要完成的.硬着头皮做吧,好在最后弄 ...