scala实现建造器模式

package com.linewell.modeldesgin.builder

/**
* 建造者模式
* Created by ctao on 2015/8/8.
*/

/**
* 角色建造者
*/
trait ActorBuilder {
    /**
     * 角色
     */
    protected var actor: Actor

    /**
     * 设置角色
     */
    def buildRole(): Unit

    /**
     * 设置性别
     */
    def buildSex(): Unit

    /**
     * 设置脸型
     */
    def buildFace(): Unit

    /**
     * 设置服装
     */
    def buildCostume(): Unit

    //是否为光头
    val BareHead = false

    //设置发型
    def buildHairStyle(): Unit

    //创建角色
    def createActor(): Actor

    /**
     * 控制枢纽,控制每一步的顺序
     * @param ab 建造者
     * @return 创建的角色
     */
    def construct(ab: ActorBuilder): Actor = {
        //先设置角色,再设置性别,其次是脸型,服装,用钩子程序判断是否是光头,不是光头则设置发型
        ab.buildRole()
        ab.buildSex()
        ab.buildFace()
        ab.buildCostume()
        if (!ab.BareHead) {
            ab.buildHairStyle()
        }
        ab.createActor()
    }
}


/**
* 角色类
*/
class Actor {
    //角色
    var role: String = _
    //性别
    var sex: String = _
    //脸型
    var face: String = _
    //服装
    var costume: String = _
    //发型
    var hairstyle: String = "光头"

}

/**
* 英雄建造器
*/
object HeroBuilder extends ActorBuilder {

    override protected var actor: Actor = new Actor()

    override def buildRole() = actor.role = "英雄"

    override def buildSex() = actor.sex = "男"

    override def buildFace() = actor.face = "英俊"

    override def buildCostume() = actor.costume = "盔甲"

    override def buildHairStyle() = actor.hairstyle = "飘逸"

    override def createActor() = actor
}

object  DevilBuilder extends  ActorBuilder{
    override protected var actor: Actor = new Actor()

    override def buildRole() = actor.role = "恶魔"

    override def buildSex() = actor.sex = "妖"

    override def buildFace() = actor.face = "丑陋"

    override def buildCostume() = actor.costume = "黑衣"


    override def buildHairStyle() = actor.hairstyle = "我想要头发"

    /**
     * 由于钩子程序的存在并不会执行buildHairStyle
     */
    override  val BareHead = true
     override def createActor() = actor
}

object  AngleBuilder extends  ActorBuilder{
    override protected var actor: Actor = new Actor()

    override def buildRole() = actor.role = "天使"

    override def buildSex() = actor.sex = "女"

    override def buildFace() = actor.face = "漂亮"

    override def buildCostume() = actor.costume = "白裙"

    override def buildHairStyle() = actor.hairstyle = "长发"

    override def createActor() = actor
}


package com.linewell.modeldesgin.builder

/**
* 测试客户端
* Created by ctao on 2015/8/8.
*/
object Client extends App {
    /**
     * 英雄构造器
     */
    val ab1: ActorBuilder = HeroBuilder
    val actor1 = ab1.construct(ab1)
    println(actor1.role+"的外观:")
    println("性别:"+actor1.sex)
    println("面容:"+actor1.face)
    println("服装:"+actor1.costume)
    println("发型:"+actor1.hairstyle)

    /**
     * 天使构造器
     */
    val ab2: ActorBuilder = AngleBuilder
    val actor2 = ab2.construct(ab2)
    println(actor2.role+"的外观:")
    println("性别:"+actor2.sex)
    println("面容:"+actor2.face)
    println("服装:"+actor2.costume)
    println("发型:"+actor2.hairstyle)

    /**
     * 恶魔构造器
     */
    val ab3: ActorBuilder = DevilBuilder
    val actor3 = ab3.construct(ab3)
    println(actor3.role+"的外观:")
    println("性别:"+actor3.sex)
    println("面容:"+actor3.face)
    println("服装:"+actor3.costume)
    println("发型:"+actor3.hairstyle)
}

猜你喜欢

转载自cjuexuan.iteye.com/blog/2233771