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的学习队伍中来吧。

你可能感兴趣的:(AOP,scala)