zoukankan      html  css  js  c++  java
  • scala-trait实现AOP编程

    步骤1:声明表示基本动作方法的模块Taction
    //声明表示基本动作方法的模块Taction
    trait TAction {
    def doAction
    }
    

     步骤2:定义一下加入了前置处理和后置处理的特征TBeforeAfter

    trait TBeforeAfter extends TAction {
    abstract override  def doAction {
      //doAction的前置处理  
      println("/entry before-action") 
      super.doAction
      //doAction的后置处理
      println("/exit after-action") 
      }
    }
    

        通过上面的abstract override def doAction {}语句来覆盖虚方法。具体来说这当中的super.doAction是关键,他调用了TAction的doAction方法。其原理是,由于doAction是虚方法,所以实际被执行的是被调用的实体类中所定义的方法。、

    步骤3:实现实际执行的实体类RealAction

    class RealAction extends TAction {
      def doAction = {
        println("** real action done!! **") 
      }
    }
    

    测试

    object TestTrait {
      def main(args : Array[String]) : Unit = {

    val act1 = new RealAction with TBeforeAfter
    act1.doAction

    val act2 = new RealAction with TBeforeAfter with TTwiceAction
    act2.doAction

    val act3 = new RealAction with TTwiceAction with TBeforeAfter
    act3.doAction

      }
    }

    /entry before-action
    ** real action done!! **
    /exit after-action

    接着为他定义一下别的方面,然后将这些方面加入到同一对象的方法中。接着定义一个将源方法执行两遍的方面。

     

    trait TTwiceAction extends TAction {
      abstract override def doAction {
        for (i <- 1 to 2){
          super.doAction
          println("==>NO. " + i)
        }
      }
    }
    

    下面,将TBeforeAfter和TtwiceAction混合在一起后执行一下。

    /entry before-action
    ** real action done!! **
    /exit after-action
    ==>NO. 1
    /entry before-action
    ** real action done!! **
    /exit after-action
    ==>NO. 2

    伴随着原来方法的before/after动作一起各自执行了两次。接着将混入顺序颠倒后再试一下。

    /entry before-action
    ** real action done!! **
    ==>NO. 1
    ** real action done!! **
    ==>NO. 2
    /exit after-action

    这样执行后,原来的实现方法被循环执行了两次,但是before/after则在循环以外整体只执行了一次。这是根据with语句定义的顺序来执行的,知道了这原理之后也就没有什么奇怪的了。Scala特性的如此混入顺序是和AspectJ的方面以及Spring的interceptor相同的。

      

     

      

  • 相关阅读:
    P3384 【模板】树链剖分
    AW136 邻值查找 (【模板】set)
    android布局自适应
    android HttpClient接口实现网络通信
    android加载html,以及js通讯
    mktime 和strtotime获取今日、昨日、上周、本月的起始时间戳和结束时间戳,
    mysql查询今天,昨天,近7天,近30天,本月,上一月数据方法
    瀑布流(masonry和infinitescroll)、(grid-a-licious)
    使用 JavaScript 修改浏览器 URL 地址栏
    测试UTF8编码的文件是不是加了BOM
  • 原文地址:https://www.cnblogs.com/ilinuxer/p/5167607.html
Copyright © 2011-2022 走看看