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实现设计模式之模版方法模式)