Scala:使用Curry实现AOP

业余时间学了学Scala,至今有3个多月了...这两天看到群(54813143)里有同学讨论AOP,于是就想出了如下实现;
见代码及注释,欢迎喜欢Scala的同学一起讨论:

//trait里没有任何抽象的值或方法
trait AOP{
private var targets=List[Function1[String,Any]]() //List里放的都是函数对象
private val placeholder="" //无意义,用来调用函数对象的

def before=println("before...")
def after=println("after...")
def invoke(target:Function1[String,Any])={ //参数是个函数对象
before
target(placeholder) //什么时候调用,自己放置顺序
after
}
def add(t:Function1[String,Any])= targets=t::targets //收集所有被拦截的方法(函数对象)
def invokeAll()={
before
targets.reverse.foreach(t=>t(placeholder)) //reverse:保证调用的顺序(FIFO)
after
//这里需要一个清空targets的方法,就不写了
}
}

class Write extends AOP{
def writeOne(x:String,y:String)(placeholder:String)={ //curry化,最后一个placeholder算是冗余参数
println("one working..."+x+y)
}
def writeTwo(x:String,y:String,z:String)(placeholder:String)={
println("two working..."+x+y+z)
}
}

val w=new Write()
w.invoke(w.writeOne("hello"," world")_) //拦截的方式,使用了偏应用函数

w.add(w.writeOne("hello"," world")_) //收集
w.add(w.writeTwo("hello"," world"," more")_) //再收集
w.invokeAll //统一拦截

这里只是给喜欢Scala的同学一个思路,期望在此思路上进行扩展。
是不是很优雅? 还在等什么,快快加入到Scala的学习队伍中来吧。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值