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

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. apache archiva安装教程

    1. 下载archiva standalone  http://archiva.apache.org/download.cgi 2. 解压,设置ARCHIVA_HOME 环境变量 3.为了防止冲突, ...

  2. Linux 下文件监控

    本文转自http://www.jiangmiao.org/blog/2179.html 在日常应用中,常常会遇到以下场景,监控文件夹A,若文件夹中的B文件发生变化,则执行C命令.Linux下可以通过i ...

  3. 【架构师之路】依赖注入原理---IoC框架

    1 IoC理论的背景    我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑.  图1:软件系统中耦合的对象 如果我们 ...

  4. linux下mysql的卸载、安装全过程

    卸载mysql 1.查找以前是否装有mysql 命令:rpm -qa|grep -i mysql 可以看到mysql的两个包: mysql-4.1.12-3.RHEL4.1 mysqlclient10 ...

  5. Log4Qt使用(三)在DailyRollingFileAppender类中增加属性mMaxBackupIndex

    在Log4Qt中存在一个比较大的问题,当使用 DailyRollingFileAppender对日志进行输出时,会无限输出文件,也就是说,当系统运行很久时,日志文件有可能很大,大到无法想象.因此,很多 ...

  6. Entrez检索实例 - NCBI

    题目:已知来豆荚斑驳病毒(bean pod mottle virus,BPMV)的名字,查询BPMV基因组信息.核酸序列信息.蛋白序列信息和结构信息 解答: 1.直接搜索,点genome,即可看到病毒 ...

  7. C#_Socket网络编程实现的简单局域网内即时聊天,发送文件,抖动窗口。

    最近接触了C#Socket网络编程,试着做了试试(*^__^*) 实现多个客户端和服务端互相发送消息 发送文件抖动窗口功能 服务端: using System; using System.Collec ...

  8. U盘装系统系列一—-安装老毛桃U盘启动制作工具

    今天跟大家分享下如何制作U盘启动盘,通过U盘启动来安装操作系统.U盘便于携带,同时能解决光驱出问题装不了系统的麻烦,可谓是装机利器!我一直用的都是老毛桃的U盘启动制作工具,很好用,很强大,就以它来演示 ...

  9. dedecms _ 当前位置问题的代码

    {dede:field name='position' runphp='yes'} $tc=" > "; $tf=split($tc,@me); $tn=count($tf) ...

  10. IIS自定义404错误页显示“系统找不到指定的文件”解决方法

    在IIS站点属性里面设置了自定义的404错误页面为一个文件之后,有时一直不生效,总是提示这样一句话:“系统找不到指定的文件”. 其实这种错误也只是在某些网站程序中出现,其实解决办法很简单.这是由于II ...