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

scala实现访问者模式

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

import scala.collection.mutable.ArrayBuffer

/**
* 访问者模式
* 员工特质:抽象元素类
* Created by ctao on 2015/9/2.
*/
trait Employee {
    /**
     * 接受一个抽象的访问者
     * @param handler 抽象访问者
     */
    def accept(handler: Department)
}

/**
* 正式员工:具体元素类
* @param name 姓名
* @param weeklyWage 周薪
* @param workTime 工作时间
*/
case class FullTimeEmployee(name: String, weeklyWage: Double, workTime: Int) extends Employee {
    override def accept(handler: Department): Unit = handler.visit(this)
}

/**
* 兼职员工:具体元素类
* @param name 姓名
* @param hourWage 时薪
* @param workTime 工作时间
*/
case class PartTimeEmployee(name: String, hourWage: Double, workTime: Int) extends Employee {
    override def accept(handler: Department): Unit = handler.visit(this)
}

/**
* 部门特质,抽象访问者特质
*/
trait Department {
    /**
     * 访问正式员工
     * @param employee 正式员工
     */
    def visit(employee: FullTimeEmployee): Unit

    /**
     * 访问兼职员工
     * @param employee 兼职员工
     */
    def visit(employee: PartTimeEmployee): Unit
}


/**
* 财务部,具体访问者类
*/
class FADepartment extends Department {
    override def visit(employee: FullTimeEmployee): Unit = {
        var weekWage = employee.weeklyWage
        val workTime = employee.workTime
        workTime match {
            case x if x >= 40 => weekWage = weekWage + (workTime - 40) * 100
            case x if x < 40 => weekWage = weekWage - (40 - workTime) * 80
                if (weekWage < 0) {
                    weekWage = 0
                }
        }
        println(s"正式员工${employee.name}实际工资为${weekWage}元")
    }

    override def visit(employee: PartTimeEmployee): Unit = {
        val workTime = employee.workTime
        println(s"兼职员工${employee.name}实际工资为${employee.hourWage * workTime}元")

    }
}


/**
* 人力资源部,具体访问者
*/
class HRDepartment extends Department {
    override def visit(employee: FullTimeEmployee): Unit = {
        val workTime = employee.workTime
        println(s"正式员工${employee.name}实际上班时间为${workTime}小时")
        workTime match {
            case x if x >= 40 => println(s"正式员工${employee.name}加班时间为${workTime - 40}")
            case x if x < 40 => println(s"正式员工${employee.name}请假时间为${40 - workTime}")
        }
    }

    override def visit(employee: PartTimeEmployee): Unit =
        println(s"兼职员工${employee.name}实际上班时间为${employee.workTime}")
}

/**
* 员工列表类,对象结构
*/
class EmployeeArray {
    private var employees = new ArrayBuffer[Employee]()

    /**
     * 添加员工
     * @param employee 员工
     */
    def addEmployee(employee: Employee) = employee match {
        case e if employees.exists(e.eq(_)) => println("已经添加")
        case _ => employees += employee
    }

    /**
     * 访问
     * @param department 部门
     */
    def accept(department: Department) = employees.foreach(_.accept(department))
}

object Client extends App {
    /**
     * 员工
     */
    val fte1: Employee = FullTimeEmployee("a", 500, 40)
    val fte2: Employee = FullTimeEmployee("b", 600, 38)
    val fte3: Employee = FullTimeEmployee("c", 550, 44)
    val fte4: Employee = PartTimeEmployee("d", 15, 33)
    val fte5: Employee = PartTimeEmployee("e", 17, 20)

    val employeeBuffer = new EmployeeArray
    /**
     * 添加员工
     */
    employeeBuffer.addEmployee(fte1)
    employeeBuffer.addEmployee(fte1)
    employeeBuffer.addEmployee(fte2)
    employeeBuffer.addEmployee(fte3)
    employeeBuffer.addEmployee(fte4)
    employeeBuffer.addEmployee(fte5)

    /**
     * 部门
     */
    val dep: Department = new HRDepartment
    /**
     * 访问
     */
    employeeBuffer.accept(dep)
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics