zoukankan      html  css  js  c++  java
  • Decorator学习笔记

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

         Decorator,装饰模式,设计模式之一,谈谈我的理解,装饰这个词在我概念中就是给某个事物加上一些美丽的外表,把它变得更加完美。但是装饰是可以随时改变的,可以拆下来换新的,换个装饰风格也不用拆房子。而且好的装饰,从这里拆下来还可以在那里用,甚至于返返工,就可以多次利用。在程序里,引入装饰的概念,在我浅薄的理解中,可以归结成为抽象和封装(这俩个概念我也不是特别懂,自己理解中应该是这样)。

      从实际应用的角度来讲,就是有某一操作需要多次重用,而且这一重复操作中会嵌套各种不同核心代码(其实就是为了实现这段代码,可以比作房子),普通的做法就是复制粘贴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次写日志的操作?

      想一个解决办法,把所有的操作都当成屋子,而检查用户当成装饰品,具体怎么做呢?

    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小学生

    -------------首席小学生
  • 相关阅读:
    INV接口管理器
    取会计科目之数字
    两个有用的oracle数据库运算:intersect和minus运算
    弹出“FRM40400:事务完成:已应用和保存X条记录
    JSP连接数据库
    javaScript JSP HTML Java CSS 注释
    Android开发环境搭建全过程
    用JAVA 实现“生产者-消费者”问题
    路由器如何当交换机使用
    validateJarFile jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet
  • 原文地址:https://www.cnblogs.com/hainan-zhang/p/5239580.html
Copyright © 2011-2022 走看看