• Ruby设计模式之策略模式二————更ruby些的策略模式


    从上一篇博文我们可以看出,策略模式的策略类实际上就是一组实现特定功能的代码集合。而ruby实际上已经原生提供了操作一组代码集合的对象,Proc类。于是我们可以用更加ruby些的方式来实现我们的Report类和策略模式。具体代码如下:

    class Report
        attr_reader :title, :text
        attr_accessor :formatter

        
    def initialize &formatter
            @title 
    = 'My report the ruby way'
            @text 
    = ['This is a report''which was written''in the ruby way']
            @formatter 
    = formatter
        end

        
    def output_report
            @formatter.call self
        end
    end

    HTML_REPORTER 
    = lambda do |context|
        puts 
    '<html>'
        puts 
    '    <head>'
        puts 
    '        <title>' + context.title + '</title>'
        puts 
    '    </head>'
        puts 
    '    <body>'
        context.text.each do 
    |line|
            puts 
    "<p>#{line}</p>"
        end
        puts 
    '    </body>'
        puts 
    '</html>'
    end

    Report.new(&HTML_REPORTER).output_report上面的例子使用Proc对象实现了策略类,对于ruby来说,这是一件很优雅的情,放佛理应如此一般。不过这并不是说明使用Proc比使用策略类更加优越。Proc只适用于简单算法实现。如果策略类的逻辑复杂度很好的话,用class来实现无疑是不二选择。

    哪些代码使用了策略模式?

    最常见的策略模式实现恐怕非rdoc莫属了。rdoc是将ruby,c,FORTRAN代码中的注释转换成文档的工具。我们平时看到的ruby核心库的帮助文档都是通过rodc自动生成的。rdoc使用策略模式实现C parser, ruby parser和FORTRAN parser,这些parser用来分析和处理源代码中的注释,每一种语言都有其特定的parser实现。

    另外rodc的输出也采用了策略模式。CHM Generrator, XML Generrator, HTML Generrator等都是策略类的具体实现。

  • 相关阅读:
    callback的实现
    TypeId和IidManager关系
    Blocks的实现
    定义返回Block的函数
    NSString与奇怪的retainCount
    ARC下的所有权修饰符
    MAC安装MYSQL
    找出数组中只出现一次的数
    写在复习MVC后
    UITableViewHeaderFooterView的封装
  • 原文地址:https://www.cnblogs.com/nbkhic/p/2114794.html
Copyright © 2020-2023  润新知