- 浏览: 13184 次
- 性别:
- 来自: 南京
文章分类
最新评论
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")
}
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")
}
发表评论
-
linux mongodb3安装
2015-10-29 15:33 259http://blog.csdn.net/cjuexuan/a ... -
scala代码重构(用递归代替var和while)
2015-09-07 19:47 380原有代码,其中使用了while循环和var /** ... -
再探设计模式之观察者模式(股票通知系统)
2015-09-05 10:28 493package com.linewell.modeldesig ... -
再探设计模式之状态模式(纸牌游戏的开发)
2015-09-04 13:52 537状态模式主要用于检测和切换状态,在状态模式下状态的转化对于客户 ... -
再探设计模式之访问者模式
2015-09-03 14:44 478访问者模式的使用条件比较苛刻主要可以以用于新增访问者时只需要 ... -
scala实现访问者模式
2015-09-02 20:54 374package com.linewell.modeldesgi ... -
scala实现模版方法模式
2015-09-02 20:54 414package com.linewell.modeldesgi ... -
scala实现状态模式
2015-09-02 16:37 384package com.linewell.modeldesgi ... -
scala实现观察者模式
2015-09-02 16:35 588package com.linewell.modeldesgi ... -
scala实现迭代器模式
2015-09-01 22:56 465package com.linewell.modeldesgi ... -
scala实现备忘录模式
2015-09-01 22:54 339package com.linewell.modeldesgi ... -
scala实现解释器模式
2015-08-31 20:20 315本来是看解释器模式,但感觉scala的实现的流利接口可以更优雅 ... -
scala实现命令模式
2015-08-30 21:20 268package com.linewell.modeldesgi ... -
scala实现职责链模式
2015-08-30 13:38 304package com.linewell.modeldesgi ... -
scala实现享元模式
2015-08-30 00:17 335package com.linewell.modeldesgi ... -
scala实现代理模式
2015-08-30 00:16 485package com.linewell.modeldesgi ... -
scala实现外观模式
2015-08-28 21:41 310package com.linewell.modeldesgi ... -
scala实现装饰者模式
2015-08-16 19:52 394package com.linewell.modeldesgi ... -
scala实现组合模式
2015-08-16 11:14 833package com.linewell.modeldesgi ... -
scala实现桥接模式
2015-08-16 11:13 311package com.linewell.modeldesgi ...
相关推荐
scala:Scala和设计模式 疯狂代码 http://CrazyCoder.cn/ ĵ:http:/CrazyCoder.cn/Java/Article42687.html 在当前软件Software设计中最流行要算GoF这本书中提出各种设计模式很多人认为设计模式对于语言(特 别是c/Java...
design-patterns-scala:用Scala语言实现设计模式
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默认库文件的API中,通过对简单的函数式编程逻辑的介绍和实践,主要是实践,建立起来一个比较明晰的scala思维模式,或者叫函数式编程的思维模式。 2 无副作用的函数式编程,同时...
Scala 的设计目的是要和两种主流面向对象编程语言Java 和 C#实现无缝互操作,这两种主流语言都非纯面向对象。 Scala 也是一门函数式变成语言,每个函数都是一个值,原生支持嵌套函数定义和高阶函数。 Scala 也支持...
本文展示了一些经典的软件设计模式在Scala中的实现。尽管Scala还有一些基于语言特性的设计模式,单本文还是着重于介绍大家所周知的经典设计模式,因为这些设计模式被认为是开发者之间交流的工具。
scala-design-patterns:在Scala中实现的设计模式
探索在Scala中对称实现面向方面的设计模式的可能性 抽象的 在面向方面的编程中,可以在非对称和对称实现之间进行区分。 面向方面的设计模式以类似AspectJ的非对称实现方式为人所知。 它们的分类之一是控制面向方面...
06.使用trait实现适配器设计模式 07.使用trait实现模板方法模式 08.使用trait实现职责链模式 09.trait的构造机制 10.trait继承class 11.案例_程序员类 第九章 包_样例类_样例对象 00,导学 01.包的简介和格式...
一、Scala核心编程课程简介近年来随着大数据的兴起,大数据核心框架Spark和Kafka也受到到广泛关注, Spark底层是Scala实现的, 因此也带火了Scala语言,目前Scala被全球知名公司(如:谷歌、百度、阿里、Twitter、...
策略模式 意图 定义一系列算法,封装每个算法,并使它们可互换。策略使算法可以独立于使用该算法的客户端而变化。 适用性 在以下情况下使用策略模式 许多相关的类仅在行为上有所不同。策略提供了一种使用多种行为之...
该作业的目的是设计一个客户端程序,该程序利用对象中的面向对象技术和设计模式来使用GitHub的GraphQL API。 我对此作业的实现是GitHub Search Application ,该应用程序允许用户在GitHub上搜索用户和存储库。 该...
模式定义与实现之间的清晰区分:模式是在编译时使用Scala标准类型定义和验证的,解析器( RootResolver )是在运行时提供的简单值。 请查阅以了解如何使用Caliban。 任何问题? 前往上的频道。 采纳者 这是在生产中...
全球资深Java技术专家的力作,系统、全面地讲解如何将模块化设计思想引入开发中,涵盖18个有助于实现模块化软件架构的模式 中文目录: 第一部分 模块化的理由 第1章 模块定义 1.1 定义模块 1.1.1 可部署 1.1.2...
全球资深Java技术专家的力作,系统、全面地讲解如何将模块化设计思想引入开发中,涵盖18个有助于实现模块化软件架构的模式 中文目录: 第一部分 模块化的理由 第1章 模块定义 1.1 定义模块 1.1.1 可部署 1.1.2 可...
中实现的面向对象和函数式设计模式的研究。 这是我自己的学习和将来的参考,但如果您发现主题很有趣,并且如果这里的信息对您的学习有所帮助,那么我会很高兴! :) 我有信心对设计模式有很好的理解,并且足够的洞察...
该库由一个Scala脚本组成,该脚本使用模型和语言实现设计模式,以定义本体论词典。 lemon设计模式提供了一个接口,用于将最常用的柠檬模式用于本体-词典接口。 该项目表示从模式语言到RDF / XML的转换器,以及用于...
对数据处理部分进行了借鉴,并在原作者的框架下进行了大量改动,原作者使用数据仓库的模式对数据进行查询和可视化取得了非常不俗的成果,本人由于时间原因和数据集规模不算特别大(百万级)没有走数据仓库的技术路线,...
大数据概述部分主要考查了大数据的基本概念、特征、发展阶段、思维转变、计算模式等基础知识。 Hadoop部分重点考查了Hadoop的核心组成、特性、生态系统组件以及HDFS相关的理论和操作。 HBase部分着重考查了HBase作为...
用scala编写 底层是基于actor模式的akka框架 代码结构简洁 基于DAG(有向无环图)的执行引擎 减少了计算时数据频繁读写到磁盘的开销 **DAG有向无环图 : spark设计之初就考虑了 大量连续计算的需求 允许在对数据处理...