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) 适配器模式 ...
随机推荐
- Linux 常用命令记录
1.查看磁盘空间使用情况 df -[a i m] 或更多 df -lh 2.查看目录文件占用大小 du -sh * du --max-depth=1 -lh 3.内存使用qingkuang free ...
- Odoo “坑” 系列之 XML中的布尔类型
在Odoo中试图通过XML方式更新某条Record的值,却意外发现根本不能更新,经查,对于XML中Boolean类型的字段,更新的方式应该采用eval的方式.
- eCharts的随笔
1.散点图中找最优记录 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type&q ...
- C++编程规范之17:避免使用“魔数”
摘要: 程序设计并非魔术,所以不要故弄玄虚,要避免在代码中使用诸如42和3.1415926这样的文字常量.它们本身没有提供任何说明,并且因为增加了难于检测的重复而使维护更加复杂.可以用符号名称和表达式 ...
- myPagination5.0 分页简单实例
记得最開始做分页採用的ThreadLocal对象,后面发现有有了更简便的方法,直接使用插件,不但简单.并且高效! 採用的版本号为myPagination5.0,可以解决client多条件无刷新动态分页 ...
- LOADRUNNER8.1卸载
卸载LOADRUNNER8.1后,不能正常又一次安装的问题. Loadrunner 8.1 安装1.下载Loadrunner8.1 (官方英文版) 2.安装Loadrunner8.1 3.破解:htt ...
- oracle group by rollup,decode,grouping,nvl,nvl2,nullif,grouping_id,group_id,grouping sets,RATIO_TO
干oracle 047文章12当问题,经验group by 声明.因此邂逅group by rollup,decode,grouping,nvl,nvl2,nullif,RATIO_TO_REPOR ...
- 前端 HTML基础
前端三大利器概述 学习前端,不得不学习前端中的三大利器:html + css + javascript.那么这三个组件分别起到什么作用呢?以人体为例,单单具有html属性的人,只是一个裸体的人偶(理解 ...
- Dialog( 对话框) 组件
一. 加载方式//class 加载方式<div class="easyui-dialog" title="My Dialog"style="wi ...
- Droppable(放置)组件
.加载方式 //class 加载方式 <div id="dd" class="easyui-droppable" data-options="a ...