`
cjuexuan
  • 浏览: 13229 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

scala实现职责链模式

 
阅读更多
package com.linewell.modeldesgin.responsechain

/**
* 职责链模式,自我感觉和akka的管理机制很像
* Created by ctao on 2015/8/30.
*/

/**
* 审批对象
* @param amount 金额
* @param number 编号
* @param purpose 采购目的
*/
case class PurchaseRequest(amount: Double, number: Int, purpose: String)


/**
* 抽象处理者,审批者类
* @param name 审批人姓名
*/
abstract class Approve(name: String) {

    /**
     * 定义后继对象
     */
    protected var successor: Approve = _

    /**
     * 设置后继对象
     * @param approve 审批者类
     */
    def setSuccessor(approve: Approve) = successor = approve

    /**
     * 抽象处理审批请求方法
     * @param request 审批对象
     */
    def processRequest(request: PurchaseRequest): Unit
}

/**
* 主任类
* @param name 审批人姓名
*/
class Director(name: String) extends Approve(name) {
    override def processRequest(request: PurchaseRequest) = request.amount match {
        case x: Double if x < 50000 =>
            println(s"主任$name 审批采购单:" + request.number + ",金额:" + request.amount + "元,采购目的:" + request.purpose)
        case _ => this.successor.processRequest(request)
    }
}

/**
* 副董事长类
* @param name 审批人姓名
*/
class VicePresident(name: String) extends Approve(name) {
    override def processRequest(request: PurchaseRequest) = request.amount match {
        case x: Double if x < 100000 =>
            println(s"副董事长$name 审批采购单:" + request.number + ",金额:" + request.amount + "元,采购目的:" + request.purpose)
        case _ => this.successor.processRequest(request)
    }
}

/**
* 董事长类
* @param name 审批人姓名
*/
class President(name: String) extends Approve(name) {
    override def processRequest(request: PurchaseRequest) = request.amount match {
        case x: Double if x < 500000 =>
            println(s"董事长$name 审批采购单:" + request.number + ",金额:" + request.amount + "元,采购目的:" + request.purpose)
        case _ => this.successor.processRequest(request)
    }
}

/**
* 董事会类
* @param name 审批人姓名
*/
class Congress(name: String) extends Approve(name) {
    override def processRequest(request: PurchaseRequest) =
        println("召开董事会审批采购单:" + request.number + ",金额:" + request.amount + "元,采购目的:" + request.purpose)
}

package com.linewell.modeldesgin.responsechain

/**
* 测试客户端
* Created by ctao on 2015/8/30.
*/
object Client extends App {
    val ZH: Approve = new Director("周华")
    val YJY: Approve = new VicePresident("游建友")
    val WZX: Approve = new President("吴志雄")
    val meeting: Approve = new Congress("董事会")

    ZH.setSuccessor(YJY)
    YJY.setSuccessor(WZX)
    WZX.setSuccessor(meeting)


    ZH.processRequest(PurchaseRequest(45000, 1001, "大数据卡口项目"))
    ZH.processRequest(PurchaseRequest(60000, 1002, "服务器购置"))
    ZH.processRequest(PurchaseRequest(145000, 1003, "星环开科技专利购买"))
    ZH.processRequest(PurchaseRequest(1145000, 1004, "公司并购"))


}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics