package tanuneko /** * Created by neko32 on 2015/12/20. */ sealed abstract class DB(host:String, userId:String, passwd:String) case class RegularRDB(host:String, userId:String, passwd:String) extends DB(host, userId, passwd) case class InMemoryDB(userId:String, passwd:String) extends DB(null, userId, passwd) case class HiveDB(host:String, userId:String, passwd:String) extends DB(host, userId, passwd) case class ResultSet(data:String) trait DBAction { def connect():Unit = {} def runQuery(str:String):ResultSet } class RegularDBAction(host:String, userId:String, passwd:String) extends DBAction { override def connect(): Unit = { println(s"connecting to ${host} with user[${userId}]") } override def runQuery(sql: String): ResultSet = { println(s"send query[${sql} to Database[${host}]") new ResultSet("returned data.") } } class InMemoryDBAction(userId:String, passwd:String) extends DBAction { override def runQuery(sql: String): ResultSet = { println(s"[inmem] running query[${sql}]") new ResultSet("returned data.") } } object Runner { def main(args:Array[String]):Unit = { val userId = "neko" val passwd = "miPasswd150X" val host = "myhost.org:16500" val sql = "select * from mydb.mytbl" def runQueryAfterConnect = (db:DB) => db match { case r:RegularRDB => { val act = new RegularDBAction(r.host, r.userId, r.passwd) act.connect() println(s"result - ${act.runQuery(sql)}") } case i:InMemoryDB => { val act = new InMemoryDBAction(i.userId, i.passwd) println(s"[inmem] result - ${act.runQuery(sql)}") } case r:HiveDB => { val act = new RegularDBAction(r.host, r.userId, r.passwd) act.connect() println(s"result - ${act.runQuery(sql)}") } } val sybase = new RegularRDB(host, userId, passwd) runQueryAfterConnect(sybase) val inmem = new InMemoryDB(userId, passwd) runQueryAfterConnect(inmem) val hive = new HiveDB(host, userId, passwd) runQueryAfterConnect(hive) } }
日曜日, 12月 20, 2015
Scala - visitorパターンのようなもの
ScalaではVisitorパターンを割合簡潔に書くことが出来る.以下の例はあるデータベース上で接続・検索を実行するモジュールで,この例では通常のRDB, HiveそしてインメモリDBをサポートしているとする.また,(乱暴ではあるが簡略のために)RDBとHiveserver2はコネクトとクエリを同一の手順,インメモリはコネクトを必要としないと仮に想定している.
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿