zoukankan      html  css  js  c++  java
  • Scala-Trait:混入与多态

      Scala 的 Trait 结合了抽象类与接口的能力,通过混入来获得灵活的多态能力。

      代码如下所示: FileAbility 提供了读取文件、处理文件的能力, 其中继承一个空实现的 Trait:LineHandler, 类似于模板方法模式; 在 ScalaTraitDemo 的 handleFile 方法中,动态定义了两个 Trait ,  在新生成的 FileAbility 对象中混入了这两个 Trait 的功能,并且实现了链式处理,类似于装饰器模式。

    package scalastudy.basic
    
    /**
     * Created by lovesqcc on 16-3-27.
     */
    trait LineHandler {
      def handle(line: String):Any = {}
    }  
    package scalastudy.basic
    
    import scala.io.Source
    
    /**
     * Created by lovesqcc on 16-3-27.
     */
    trait FileAbility extends LineHandler {
    
      def readFile(filename:String): String = {
        val fileSource =  Source.fromFile(filename)
        try {
          return fileSource.mkString
        } finally {
          fileSource.close()
        }
      }
    
      def readFileLines(filename:String):List[String] = {
        val fileSource =  Source.fromFile(filename)
        try {
          return fileSource.getLines().toList
        } finally {
          fileSource.close()
        }
      }
    
      def handleFile(filename:String):List[Any] = {
        return readFileLines(filename).map(handle(_)).toList
      }
    
      def handleFileWithNoReturn(filename:String, lineHandler: LineHandler):Unit = {
        readFileLines(filename).foreach { line =>
          lineHandler.handle(line)
        }
      }
    
    }
    package scalastudy.basic
    
    import java.util
    
    /**
     * Created by lovesqcc on 16-3-19.
     */
    object ScalaTraitDemo extends App {
    
      launch()
    
      def launch(): Unit = {
          handleFile("/etc/passwd")
      }
    
      def handleFile(filename:String):Unit = {
    
        trait LinePrintHandler extends LineHandler {
          override def handle(line: String): Any = {
            println(line)
          }
        }
    
        val fileAbility = new FileAbility with LinePrintHandler
        fileAbility.handleFile(filename)
    
    
        trait LineSplitterHandler extends LineHandler {
          override def handle(line: String): Any = {
            return super.handle(line.split(":").mkString("(", ",", ")"))
          }
        }
    
        trait LineNumberHandler extends LineHandler {
          var id = 0
          override def handle(line:String): Any = {
            id += 1
            //println("number: " + line);
            return id + ": " + line
          }
        }
    
        val fileAbility2 = new FileAbility with LineNumberHandler with LineSplitterHandler
        val result = fileAbility2.handleFile(filename)
        result.foreach { ref =>
          ref match {
            case s:String => println(s)
            case a:Array[Any] =>  for(e <- ref.asInstanceOf[Array[Any]]) {println(e)}
            case a:List[Any] =>  for(e <- ref.asInstanceOf[List[Any]]) {println(e)}
            case _ => println(ref)
          }
        }
    
      }
    
    }
  • 相关阅读:
    zabbix3.0.4使用percona-monitoring-plugins插件来监控mysql5.6的详细实现过程
    centos6.5环境wget报错Unable to establish SSL connection
    文件缓存tmpfs简单使用
    codis3.2安装报错dashboard.go:369: [PANIC] call rpc create-proxy to dashboard 127.0.0.1:18080 failed的处理
    saltstack自动化运维系列12配置管理安装redis-3.2.8
    反向代理负载均衡之APACHE
    web服务器tomcat入门实战
    haproxy配置基于ssl证书的https负载均衡
    keepalived实现haproxy负载均衡器的高可用
    centos7使用haproxy1.7.5实现反向代理负载均衡实战
  • 原文地址:https://www.cnblogs.com/lovesqcc/p/5327435.html
Copyright © 2011-2022 走看看