演化架构与紧急设计: 语言、表达性与设计:第 2 部分
2009-11-05 00:00:00 来源:WEB开发网Logger 是一个简单的日志程序,用于将日志消息写入控制台。TimeStampingLogger 通过修饰添加了一个时间戳,而 UpperLogger 用于将日志消息更改为大写。要使用这些修饰符,需要使用适当的修饰符封装一个 Logger 实例,如清单 2 所示:
清单 2. 使用修饰符封装日志程序
def logger = new UpperLogger(
new TimeStampingLogger(
new Logger()))
logger.log("Groovy Rocks")
清单 2 的输出显示了一个大写的、带时间戳的日志消息:
Tue May 22 07:13:50 EST 2007: GROOVY ROCKS
目前为止,这个修饰符唯一不寻常的地方就是它所使用的 Groovy 实现。但是,我在创建修饰符时可以不用添加额外的基于类的方法结构。
准备修饰
四人组书籍中的传统设计模式假定每个问题的解决方案都构建构建更多的类。但是,基于 JVM 的现代语言提供了一些额外的便利性,比如说开放类,它允许您重新打开已有类并向它们添加新的方法,而不需要子类化过程。当您需要更改基础架构某部分(例如,集合 API)所使用的某个类的行为,而该行为又需要某个特定的类时,这种方式极为方便。您可以修改已有类,将它作为参数传递,并利用 API,而不需要基础 API 声明一个抽象类或接口。开放类还允许您执行 “就地” 修改,而不需要子类化过程。
但是,修改整个类定义听起来有点令人担心:您可能不希望对整个类执行全面修改。幸运的是,Groovy 和 Ruby 都允许您向单个类实例 添加新的方法。换句话说,您可以向某个 Logger 实例添加一个新方法,而不会影响它的所有其他实例。清单 3 显示如何使用 ExpandoMetaClass 在 Groovy 中重写某个 Logger 实例的 log() 方法:
更多精彩
赞助商链接