WEB开发网
开发学院软件开发Java 实战 Groovy: 用 curry 过的闭包进行函数式编程 阅读

实战 Groovy: 用 curry 过的闭包进行函数式编程

 2009-11-19 00:00:00 来源:WEB开发网   
核心提示: 清单 8. 图书业务对象importfp.*classBook{@Propertyname@Propertyauthor@Propertyprice@Propertycategory}defbk=newBook(name:'Groovy',author:'KenB'


清单 8. 图书业务对象
import fp.* 
class Book { 
  @Property name 
  @Property author 
  @Property price 
  @Property category 
} 
def bk = new Book(name : 'Groovy', author : 
 'KenB', price : 25, category : 'CompSci') 
// constants 
def discountRate = 0.1 
def taxRate = 0.17 
// book closures 
def calcDiscountedPrice = Functor.rMultiply.curry(1 - discountRate) 
def calcTax = Functor.rMultiply.curry(1 + taxRate) 
def calcNetPrice = 
 Functor.composition.curry(calcTax, calcDiscountedPrice) 
// now calculate net prices 
def netPrice = calcNetPrice(bk.price) 
println "netPrice: ${netPrice}" // netPrice: 26.325 

更加 groovy 的访问者

已经看到了如何把 curry 过的闭包应用于函数模式,所以现在我们来看看在使用相似的技术重新访问重要的面向对象设计模式时发生了什么。对于面向对象系统来说,必须遍历对象集合并在集合中的每个元素上执行某个操作,是非常普通的使用情况。假设一个不同的场景,系统要遍历相同的集合,但是要执行不同的操作。通常,需要用 Visitor 设计模式来满足这一需求。Visitor 接口引入了处理集合元素的动作协议。具体的子类定义需要的不同行为。方法被引进来遍历集合并对每个元素应用 Visitor 动作。

如果到现在您还没猜出来,那么可以用闭包实现同的效果。这种方法的一个抽象是:使用闭包,不需要开发访问者类的层次结构。而且,可以有效地使用闭包复合和映射来定义集合的动作和效果遍历。

上一页  2 3 4 5 6 7 8 9 10  下一页

Tags:实战 Groovy curry

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接