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

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")

}
分享到:
评论

相关推荐

    Scala和设计模式.pdf

    scala:Scala和设计模式 疯狂代码 http://CrazyCoder.cn/ ĵ:http:/CrazyCoder.cn/Java/Article42687.html 在当前软件Software设计中最流行要算GoF这本书中提出各种设计模式很多人认为设计模式对于语言(特 别是c/Java...

    design-patterns-scala:用Scala语言实现设计模式

    design-patterns-scala:用Scala语言实现设计模式

    Scala程序设计(第2版)

    23.4 设计模式 442 23.4.1 构造型模式 443 23.4.2 结构型模式 443 23.4.3 行为型模式 444 23.5 契约式设计带来更好的设计 446 23.6 帕特农神庙架构 448 23.7 本章回顾与下一章提要 453 第24章...

    Scala函数式编程

    很大篇幅都放在,使用scala实现scala默认库文件的API中,通过对简单的函数式编程逻辑的介绍和实践,主要是实践,建立起来一个比较明晰的scala思维模式,或者叫函数式编程的思维模式。 2 无副作用的函数式编程,同时...

    Scala语言规范-2019.rar

    Scala 的设计目的是要和两种主流面向对象编程语言Java 和 C#实现无缝互操作,这两种主流语言都非纯面向对象。 Scala 也是一门函数式变成语言,每个函数都是一个值,原生支持嵌套函数定义和高阶函数。 Scala 也支持...

    scala设计模式

    本文展示了一些经典的软件设计模式在Scala中的实现。尽管Scala还有一些基于语言特性的设计模式,单本文还是着重于介绍大家所周知的经典设计模式,因为这些设计模式被认为是开发者之间交流的工具。

    scala-design-patterns:在Scala中实现的设计模式

    scala-design-patterns:在Scala中实现的设计模式

    scala_ao_patterns:Scala中面向方面的设计模式实现

    探索在Scala中对称实现面向方面的设计模式的可能性 抽象的 在面向方面的编程中,可以在非对称和对称实现之间进行区分。 面向方面的设计模式以类似AspectJ的非对称实现方式为人所知。 它们的分类之一是控制面向方面...

    scala从入门到精通技术教学视频

    06.使用trait实现适配器设计模式 07.使用trait实现模板方法模式 08.使用trait实现职责链模式 09.trait的构造机制 10.trait继承class 11.案例_程序员类 第九章 包_样例类_样例对象 00,导学 01.包的简介和格式...

    大数据—Scala

    一、Scala核心编程课程简介近年来随着大数据的兴起,大数据核心框架Spark和Kafka也受到到广泛关注, Spark底层是Scala实现的, 因此也带火了Scala语言,目前Scala被全球知名公司(如:谷歌、百度、阿里、Twitter、...

    Strategy_Scala_Design_Pattern:Scala中启动模式组成的设计模式实现

    策略模式 意图 定义一系列算法,封装每个算法,并使它们可互换。策略使算法可以独立于使用该算法的客户端而变化。 适用性 在以下情况下使用策略模式 许多相关的类仅在行为上有所不同。策略提供了一种使用多种行为之...

    matlab转换java代码-github-graphql-search:一个用Scala编写的客户端程序,使用GitHub的GraphQLA

    该作业的目的是设计一个客户端程序,该程序利用对象中的面向对象技术和设计模式来使用GitHub的GraphQL API。 我对此作业的实现是GitHub Search Application ,该应用程序允许用户在GitHub上搜索用户和存储库。 该...

    caliban:Scala的功能GraphQL库

    模式定义与实现之间的清晰区分:模式是在编译时使用Scala标准类型定义和验证的,解析器( RootResolver )是在运行时提供的简单值。 请查阅以了解如何使用Caliban。 任何问题? 前往上的频道。 采纳者 这是在生产中...

    Java Application Architecture Modularity Patterns with Examples Using OSGi Part2

    全球资深Java技术专家的力作,系统、全面地讲解如何将模块化设计思想引入开发中,涵盖18个有助于实现模块化软件架构的模式 中文目录: 第一部分 模块化的理由 第1章 模块定义 1.1 定义模块 1.1.1 可部署 1.1.2...

    Java Application Architecture Modularity Patterns with Examples Using OSGi Part1

    全球资深Java技术专家的力作,系统、全面地讲解如何将模块化设计思想引入开发中,涵盖18个有助于实现模块化软件架构的模式 中文目录: 第一部分 模块化的理由 第1章 模块定义 1.1 定义模块 1.1.1 可部署 1.1.2 可...

    java笔试题国企-design-patterns-study:对面向对象和功能设计模式的研究

    中实现的面向对象和函数式设计模式的研究。 这是我自己的学习和将来的参考,但如果您发现主题很有趣,并且如果这里的信息对您的学习有所帮助,那么我会很高兴! :) 我有信心对设计模式有很好的理解,并且足够的洞察...

    lemon.patterns:使用Lemon和OWL的本体-词典接口的设计模式

    该库由一个Scala脚本组成,该脚本使用模型和语言实现设计模式,以定义本体论词典。 lemon设计模式提供了一个接口,用于将最常用的柠檬模式用于本体-词典接口。 该项目表示从模式语言到RDF / XML的转换器,以及用于...

    基于Java+Scala深圳地铁大数据客流分析系统源码+数据集(100w)+文档说明

    对数据处理部分进行了借鉴,并在原作者的框架下进行了大量改动,原作者使用数据仓库的模式对数据进行查询和可视化取得了非常不俗的成果,本人由于时间原因和数据集规模不算特别大(百万级)没有走数据仓库的技术路线,...

    大数据习题(2024)-大数据概述部分主要考查了大数据的基本概念、特征、发展阶段、思维转变、计算模式等基础知识

    大数据概述部分主要考查了大数据的基本概念、特征、发展阶段、思维转变、计算模式等基础知识。 Hadoop部分重点考查了Hadoop的核心组成、特性、生态系统组件以及HDFS相关的理论和操作。 HBase部分着重考查了HBase作为...

    spark讲义总结1

    用scala编写 底层是基于actor模式的akka框架 代码结构简洁 基于DAG(有向无环图)的执行引擎 减少了计算时数据频繁读写到磁盘的开销 **DAG有向无环图 : spark设计之初就考虑了 大量连续计算的需求 允许在对数据处理...

Global site tag (gtag.js) - Google Analytics