scala实现模版方法模式

package com.linewell.modeldesgin.template

import com.linewell.modeldesgin.dao.AccessDAO

import scala.collection.mutable.ArrayBuffer

/**
* 模版方法模式
* Created by ctao on 2015/9/2.
*/
trait Account {

/**
* 验证帐号
* @param account 用户名
* @param pass 密码
* @return 是否合法
*/
def validate(account: String, pass: String): Boolean = {
val params = ArrayBuffer[Any](account)
val result = AccessDAO.checkUser(params)
result.head.getOrElse("name", "null") == account && result.head.getOrElse("pass", "null") == pass
}


/**
* 计算利息的方式
*/
def calculateInterest(): Unit

/**
* 显示方法
*/
def display() = println("显示利息")

/**
* 模版方法
* @param account 账户
* @param pass 密码
*/
def handle(account: String, pass: String): Unit = validate(account, pass) match {
case true => calculateInterest()
display()
case false =>
println("账户或密码错误")
}


}

/**
* 活期帐户
*/
case object CurrentAccount extends Account {
override def calculateInterest(): Unit = println("按照活期计算利息")
}

/**
* 定期帐户
*/
case object SavingAccount extends Account {
override def calculateInterest(): Unit = println("按照定期计算利息")
}

package com.linewell.modeldesgin.template

/**
* 测试客户端
* Created by ctao on 2015/9/2.
*/
object Client extends App {
val account1: Account = SavingAccount
account1.handle("ct", "123")

val account2: Account = SavingAccount
account2.handle("ct", "1233")


val account3: Account = CurrentAccount
account3.handle("ct", "123")
}
package com.linewell.modeldesgin.template

/**
* 钩子方法的使用
* Created by ctao on 2015/9/2.
*/
sealed trait DataViewer {

/**
* 获取数据格式
*/
def data(): Unit

/**
* 转化方法
*/
private def convertData() = println("将数据转化为XML格式")

/**
* 展示方法
*/
private def displayData(): Unit = println("以XML形式显示数据")

/**
* 是否为xml格式
* @return 判断结果
*/
protected def isNotXmlData = true

/**
* 模版方法
*/
def process(): Unit = {
data()

/**
* 钩子
*/
if (isNotXmlData) {
convertData()
}
displayData()
}

}

/**
*XML格式数据
*/
case object XMLDataViewer extends DataViewer {
override def data(): Unit = println("从XML文件中获取数据")


override def isNotXmlData = false
}

/**
* JSON格式数据
*/
case object JSONDataViewer extends DataViewer {
override def data(): Unit = println("从JSON文件中获取数据")
}

package com.linewell.modeldesgin.template

/**
* 测试客户端
* Created by ctao on 2015/9/2.
*/
object ClientHook extends App {
val dataView1 = XMLDataViewer
val dataView2 = JSONDataViewer
dataView1.process()
dataView2.process()
}

你可能感兴趣的:(scala,设计模式,scala,json)