scala实现中介者模式

package com.linewell.modeldesgin.mediator

import scala.collection.mutable.ArrayBuffer

/**
* 中介者模式,抽象中介者,通信软件
* Created by ctao on 2015/9/1.
*/
abstract class AbstractSoftware(val name: String) {
    private var persons = new ArrayBuffer[Person]()

    /**
     * 增加用户
     * @param person 用户
     */
    def addPerson(person: Person): Unit = {
        if (persons.forall(!person.eq(_))) {
            println(s"群${name}增加${person.name}")
            persons += person
        } else {
            println(s"用户${person.name}已在群${name}内")
        }
    }

    /**
     * 删除用户
     * @param person 用户
     */
    def removePerson(person: Person): Unit = {
        if (persons.exists(person.eq(_))) {
            persons -= person
        } else {
            println("该用户已被删除")
        }
    }

    /**
     * 发放通知
     * @param person 发起者
     * @param message 信息
     */
    def notify(person: Person, message: String): Unit = {
        if (persons.exists(person.eq(_))) {
            persons.filter(!person.eq(_)).foreach(p => println(s"${p.name}从${person.name}接收到信息:$message"))
        } else {
            println(s"${person.name}您已经不在群组:$name")
        }

    }

    /**
     * 私聊
     * @param send 发送者
     * @param receive 接收者
     * @param message 信息
     */
    def pm(send: Person, receive: Person, message: String): Unit = send match {
        case p if persons.exists(p.eq(_)) => receive match {
            case r if persons.exists(r.eq(_)) => println(s"${send.name}发送信息:$message 给${receive.name}")
            case _ => println(s"接收者${receive.name}没有获得该软件的许可")
        }
        case _ => println(s"发送者${send.name}没有获得该软件的许可")
    }
}

/**
* qq,具体中介者
* @param name 群名
*/
class QQSoftware(name: String) extends AbstractSoftware(name) {
    override def notify(person: Person, message: String): Unit = {
        println(s"这里是qq:$name")
        super.notify(person, message)
    }

    override def pm(send: Person, receive: Person, message: String): Unit = {
        println(s"使用qq软件进行私聊")
        super.pm(send, receive, message)
    }


}

/**
* msn,具体中介者
* @param name 群名
*/
class MSNSoftware(name: String) extends AbstractSoftware(name) {
    override def notify(person: Person, message: String): Unit = {
        println(s"这里是msn群:$name")
        super.notify(person, message)
    }

    override def pm(send: Person, receive: Person, message: String): Unit = {
        println(s"使用msn软件进行私聊")
        super.pm(send, receive, message)
    }


}


/**
* 抽象同事类
* @param name 名称
*/
abstract class Person(val name: String) {
    /**
     * 设置群组
     * @param software 群组
     */
    def setAbstractSoftware(software: AbstractSoftware)

    /**
     * 发言
     * @param message 信息
     */
    def speak(message: String): Unit

    /**
     * 删除用户
     * @param person 用户
     */
    def remove(person: Person): Unit

    /**
     * 增加用户
     * @param person 用户
     */
    def add(person: Person): Unit

    /**
     * 私聊
     * @param person 接收者
     * @param message 信息
     */
    def privateChat(person: Person, message: String):Unit
}

/**
* 管理员角色,属于同事
* @param name 名称
*/
class Admin(name: String) extends Person(name) {
    private var abstractSoftware: AbstractSoftware = null

    def setAbstractSoftware(software: AbstractSoftware) = abstractSoftware = software

    override def speak(message: String) = abstractSoftware.notify(this, message)

    /**
     * 删除
     * @param person 用户
     */
    def remove(person: Person) = abstractSoftware.removePerson(person)

    /**
     * 增加
     * @param person 用户
     */
    def add(person: Person) = {
        println(s"${name}进行添加用户${person.name}的操作")
        abstractSoftware.addPerson(person)
    }

    /**
     * 私聊
     * @param person 接收者
     * @param message 信息
     */
    def privateChat(person: Person, message: String) = abstractSoftware.pm(this, person, message)
}

/**
* 普通用户角色,属于同事
* @param name 名称
*/
class Member(name: String) extends Person(name) {
    private var abstractSoftware: AbstractSoftware = null

    def setAbstractSoftware(software: AbstractSoftware) = abstractSoftware = software

    override def speak(message: String) = abstractSoftware.notify(this, message)

    /**
     * 增加用户
     * @param person 用户
     */
    override def add(person: Person): Unit = {
        println(s"${name}您不是管理员,不具备增加用户权限")

    }

    /**
     * 判断是否为删除自己,如果是删除自己则为退群
     * @param person 用户
     */
    override def remove(person: Person): Unit = {
        if (person.eq(this)) {
            println(s"$name,您将退出${abstractSoftware.name}")
            abstractSoftware.removePerson(person)
        } else {
            println(s"${name}您不是管理员,不具备删除用户权限")
        }
    }

    /**
     * 私聊
     * @param person 接收者
     * @param message 信息
     */
    def privateChat(person: Person, message: String) = abstractSoftware.pm(this, person, message)
}



package com.linewell.modeldesgin.mediator

/**
* 测试客户端
* Created by ctao on 2015/9/1.
*/
object Client extends App {
    val admin: Person = new Admin("admin")
    val member1: Person = new Member("member1")
    val member2: Person = new Member("member2")
    val member3: Person = new Member("member3")
    val member4: Person = new Member("member4")

    val qqSoftware: AbstractSoftware = new QQSoftware("研发中心")
    admin.setAbstractSoftware(qqSoftware)
    member1.setAbstractSoftware(qqSoftware)
    member2.setAbstractSoftware(qqSoftware)
    member3.setAbstractSoftware(qqSoftware)
    member4.setAbstractSoftware(qqSoftware)

    admin.add(admin)
    admin.add(member1)
    admin.add(member2)
    admin.add(member3)
    admin.add(member4)
    admin.add(member1)

    admin.speak("hello")
    admin.remove(member1)

    member1.speak("hi")

    member2.add(member1)
    member2.remove(member2)

    member2.speak("admin")

    member3.privateChat(admin, "你好")
    member3.privateChat(member2, "你好")



    member2.privateChat(admin, "加我")

    println("------------------------------------------")

    val msnSoftware: AbstractSoftware = new MSNSoftware("通研事业部")
    admin.setAbstractSoftware(msnSoftware)
    member1.setAbstractSoftware(msnSoftware)
    member2.setAbstractSoftware(msnSoftware)
    member3.setAbstractSoftware(msnSoftware)
    member4.setAbstractSoftware(msnSoftware)


    admin.add(admin)
    admin.add(member1)
    admin.add(member2)
    admin.add(member3)
    admin.add(member4)
    admin.add(member1)

    admin.speak("hello")
    admin.remove(member1)

    member1.speak("hi")

    member2.add(member1)

    member2.speak("admin")

    member2.privateChat(member3,"test")

}

猜你喜欢

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