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
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
上面的例子使用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等都是策略类的具体实现。
相关内容
这些是最新的
热门排行
- THINKPHP5+GatewayWorker+Workerman 开发在线客服系统
- 在手机浏览器网页中点击链接跳转到微信界面的方法
- 尊云网站目录系统 ThinkPHP5网站分类目录程序 v2.2.221011
- CentOS 7安装shadowsock(一键安装脚本)
- AdminTemplate 基于LayUI 2.4.5实现的网站后台管理模板
- 用NW.js(node-webkit)开发多平台的桌面客户端
- PHP生成随机昵称/用户名
- THINKPHP5网站分类目录程序 尊云网站目录系统
- 织梦(DEDECMS)微信支付接口 微信插件
- 基于LayUI开发的 网站后台管理模板 BeginnerAdmin
- 响应式后台网站模板 - AMA.ADMIN
- layuiAdmin后台管理模板 Iframe版
- LayUI 1.0.9 升级 至 LayUI 2.1.4 方法
- 简洁清爽的会员中心模板
- jQuery幸运大转盘抽奖活动代码