初学者,自己的理解,请各位前辈不吝指正!

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学习笔记的更多相关文章

  1. [学习笔记]设计模式之Decorator

    写在前面 为方便读者,本文已添加至索引: 设计模式 学习笔记索引 Decorator(装饰)模式,可以动态地给一个对象添加一些额外的职能.为了更好地理解这个模式,我们将时间线拉回Bridge模式笔记的 ...

  2. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  3. 《Node.js开发实战详解》学习笔记

    <Node.js开发实战详解>学习笔记 ——持续更新中 一.NodeJS设计模式 1 . 单例模式 顾名思义,单例就是保证一个类只有一个实例,实现的方法是,先判断实例是否存在,如果存在则直 ...

  4. [学习笔记]设计模式之Proxy

    为方便读者,本文已添加至索引: 设计模式 学习笔记索引 写在前面 “魔镜啊魔镜,谁是这个世界上最美丽的人?” 每到晚上,女王都会问魔镜相同的问题(见Decorator模式).这是她还曾身为女巫时留下的 ...

  5. Java学习笔记4

    Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...

  6. Python学习笔记012——装饰器

    1 装饰器 1.1装饰器定义 在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator). 1.2 装饰器分类 装饰器:函数装饰器,类装饰器,函数的装饰器,类的装饰器 装饰器:函数装饰函 ...

  7. 23 DesignPatterns学习笔记:C++语言实现 --- 1.4 Builder

    23 DesignPatterns学习笔记:C++语言实现 --- 1.4 Builder 2016-07-21 (www.cnblogs.com/icmzn) 模式理解

  8. 23 DesignPatterns学习笔记:C++语言实现

    DesignPatterns学习笔记:C++语言实现 (转载请注明出处:http://www.cnblogs.com/icmzn/p/5680784.html) 1. 创建型设计模式: (1)Faco ...

  9. 设计模式学习笔记——java中常用的设计模式

    单例设计模式(Singleton Pattern) 观察者模式(Observer Pattern) 工厂模式(Factory Pattern) 策略模式(Strategy Pattern) 适配器模式 ...

随机推荐

  1. Shell中变量的使用

    1.变量的声明 name="blacksonny" 注意://变量定义时不加$,变量与等号之间不能有空格 变量命名规则: 首个字符必须为字母(a-z,A-Z). 中间不能有空格,可 ...

  2. mac下Apache添加限速模块mod_bw

    官方文档: Apache2 - Mod_bw v0.7 Author : Ivan Barrera A. (Bruce) HomePage : Http://Ivn.cl/apache & h ...

  3. AngularJs学习笔记6——四大特性之依赖注入

    压缩工具:YUI-compressor 为了优化网页功能,对一些脚本文件进行压缩,比如:删除所有的注释和空格等,简化形参.但是AngularJs模块中可以声明多种组件,如控制器.指令.过滤器.服务等. ...

  4. 採集和输出 DeckLink Studio 4K

  5. 局域网指定 IP 地址后无法上网的问题

    子网掩码.默认网关.DNS 与局域网设置有关,建议指定前先 运行 cmd -> ipconfig /all 查看一下自动获取的信息. 另外留意指定IP 后需打开高级设置 -> WINS,勾 ...

  6. (转)SQL Server 2005附加2008的数据库

    1. 生成for 2005版本的数据库脚本  2008 的manger studio  -- 打开"对象资源管理器"(没有的话按F8), 连接到你的实例  -- 右键要转到2005 ...

  7. ADO.NET之使用DataGridView控件显示从服务器上获取的数据

    今天回顾下ADO.NET中关于使用DataGridiew控件显示数据的相关知识 理论整理: 使用 DataGridView 控件,可以显示和编辑来自多种不同类型的数据源的表格数据. SqlDataAd ...

  8. C++中的析构函数

    代码: #include <cstdio> #include <iostream> using namespace std; class A{ public: ~A(){ co ...

  9. ARP协议的报文格式 转自n哖苡逅

    ARP协议的报文格式 结构ether_header定义了以太网帧首部:结构arphdr定义了其后的5个字段,其信息用于在任何类型的介质上传送ARP请求和回答:ether_arp结构除了包含arphdr ...

  10. SpringMVC项目中中文字符乱码问题及解决办法总结(非专业最优解决办法) -- ajax传值乱码; request.getParameter()乱码;

    情况一: ajax中传值时是乱码(后台可以获取到中文字符,但用@ResponseBody返回时前台为乱码) 情况二: Controller 中 request.getParameter()获取到的是乱 ...