- 浏览: 13196 次
- 性别:
- 来自: 南京
文章分类
最新评论
package com.linewell.modeldesgin.Composite
import scala.collection.mutable.ArrayBuffer
/**
* 抽象构件,透明组合模式
* Created by ctao on 2015/8/16.
*/
trait AbstractFile {
def add(abstractFile: AbstractFile) = println("对不起,不支持该方法")
def remove(abstractFile: AbstractFile) = println("对不起,不支持该方法")
def child(i: Int): AbstractFile = {
println("对不起,不支持该方法")
null
}
def killVirus(): Unit
}
/**
* 图片文件样例类
* @param name 文件名
*/
case class ImageFile(name: String) extends AbstractFile {
override def killVirus(): Unit = println(s"------对图像$name 进行杀毒")
}
/**
* 文本文件样例类
* @param name 文件名
*/
case class TextFile(name: String) extends AbstractFile {
override def killVirus(): Unit = println(s"------对文本文件$name 进行杀毒")
}
/**
* 视频文件样例类
* @param name 文件名
*/
case class VideoFile(name: String) extends AbstractFile {
override def killVirus(): Unit = println(s"------对视频文件$name 进行杀毒")
}
/**
* 文件夹样例类
* @param name 文件夹名
*/
case class Folder(name: String) extends AbstractFile {
/**
* 队列,存放文件或文件夹
*/
var fileList = new ArrayBuffer[AbstractFile]()
/**
* 插入
* @param abstractFile 抽象构件
*/
override def add(abstractFile: AbstractFile) = fileList += abstractFile
/**
* 删除
* @param abstractFile 抽象构件
*/
override def remove(abstractFile: AbstractFile) = fileList -= abstractFile
/**
* 查找孩子
* @param i 索引
* @return 子对象
*/
override def child(i: Int) = fileList(i)
/**
* 递归调用
*/
override def killVirus(): Unit = {
println(s"******对文件夹$name 进行杀毒")
for (file <- fileList) file.killVirus()
}
}
package com.linewell.modeldesgin.Composite
/**
* 测试客户端
* Created by ctao on 2015/8/16.
*/
object Client extends App {
/**
* 文件夹
*/
val folder1 = Folder("ctao的资料")
val folder2 = Folder("图像资料")
val folder3 = Folder("文本文件")
val folder4 = Folder("视频资料")
/**
* 文件
*/
val file1 = ImageFile("qq截图.jpg")
val file2 = ImageFile("美图.png")
val file3 = TextFile("solr.log")
val file4 = TextFile("迭代.doc")
val file5 = VideoFile("测试.avi")
folder2.add(file1)
folder2.add(file2)
folder3.add(file3)
folder3.add(file4)
folder4.add(file5)
folder1.add(folder2)
folder1.add(folder3)
folder1.add(folder4)
folder1.remove(folder3)
// folder1.child(2).killVirus()
/**
* 对根文件夹杀毒,递归调用
*/
folder1.killVirus()
}
import scala.collection.mutable.ArrayBuffer
/**
* 抽象构件,透明组合模式
* Created by ctao on 2015/8/16.
*/
trait AbstractFile {
def add(abstractFile: AbstractFile) = println("对不起,不支持该方法")
def remove(abstractFile: AbstractFile) = println("对不起,不支持该方法")
def child(i: Int): AbstractFile = {
println("对不起,不支持该方法")
null
}
def killVirus(): Unit
}
/**
* 图片文件样例类
* @param name 文件名
*/
case class ImageFile(name: String) extends AbstractFile {
override def killVirus(): Unit = println(s"------对图像$name 进行杀毒")
}
/**
* 文本文件样例类
* @param name 文件名
*/
case class TextFile(name: String) extends AbstractFile {
override def killVirus(): Unit = println(s"------对文本文件$name 进行杀毒")
}
/**
* 视频文件样例类
* @param name 文件名
*/
case class VideoFile(name: String) extends AbstractFile {
override def killVirus(): Unit = println(s"------对视频文件$name 进行杀毒")
}
/**
* 文件夹样例类
* @param name 文件夹名
*/
case class Folder(name: String) extends AbstractFile {
/**
* 队列,存放文件或文件夹
*/
var fileList = new ArrayBuffer[AbstractFile]()
/**
* 插入
* @param abstractFile 抽象构件
*/
override def add(abstractFile: AbstractFile) = fileList += abstractFile
/**
* 删除
* @param abstractFile 抽象构件
*/
override def remove(abstractFile: AbstractFile) = fileList -= abstractFile
/**
* 查找孩子
* @param i 索引
* @return 子对象
*/
override def child(i: Int) = fileList(i)
/**
* 递归调用
*/
override def killVirus(): Unit = {
println(s"******对文件夹$name 进行杀毒")
for (file <- fileList) file.killVirus()
}
}
package com.linewell.modeldesgin.Composite
/**
* 测试客户端
* Created by ctao on 2015/8/16.
*/
object Client extends App {
/**
* 文件夹
*/
val folder1 = Folder("ctao的资料")
val folder2 = Folder("图像资料")
val folder3 = Folder("文本文件")
val folder4 = Folder("视频资料")
/**
* 文件
*/
val file1 = ImageFile("qq截图.jpg")
val file2 = ImageFile("美图.png")
val file3 = TextFile("solr.log")
val file4 = TextFile("迭代.doc")
val file5 = VideoFile("测试.avi")
folder2.add(file1)
folder2.add(file2)
folder3.add(file3)
folder3.add(file4)
folder4.add(file5)
folder1.add(folder2)
folder1.add(folder3)
folder1.add(folder4)
folder1.remove(folder3)
// folder1.child(2).killVirus()
/**
* 对根文件夹杀毒,递归调用
*/
folder1.killVirus()
}
发表评论
-
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 496package 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 415package com.linewell.modeldesgi ... -
scala实现状态模式
2015-09-02 16:37 385package 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-09-01 14:48 286package com.linewell.modeldesgi ... -
scala实现解释器模式
2015-08-31 20:20 316本来是看解释器模式,但感觉scala的实现的流利接口可以更优雅 ... -
scala实现命令模式
2015-08-30 21:20 269package 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 486package 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:13 311package com.linewell.modeldesgi ...
相关推荐
Scala语言规范-Scala 是一门类 Java 的编程语言,它结合了面向对象编程和函数式编程。 Scala 是纯面向对象的,每个... Scala 也支持一种通用形式的模式匹配,模式匹配用来操作代数式类型,在很多函数式语言中都有实现。
19.2 使用动态特征实现Scala 中的动态调用 397 19.3 关于DSL的一些思考 402 19.4 本章回顾与下一章提要 402 第20章 Scala的领域特定语言 403 20.1 DSL 示例:Scala中XML和JSON DSL 404 20.2 内部DSL...
1.1 Scala解释器 1 1.2 声明值和变量 4 1.3 常用类型 5 1.4 算术和操作符重载 7 1.5 关于方法调用 8 1.6 apply方法 9 1.7 Scaladoc 11 练习 16 第2章 控制结构和函数 A1 19 2.1 条件表达式 20 2.2 语句...
兔一个针对Scala和Akka... 异常处理的通用模式,用于将错误发布到Airbrake,Syslog或以上所有内容模块化的与继承相比,组合更受青睐,可实现灵活且高度的代码重用。 仿照队列绑定,使用案例类建模的交换绑定对Queue和E
MacWire无需手动编写类连接代码,从而有助于实现依赖注入(DI)模式。 相反,只需声明应该连接哪些类以及如何访问实例就足够了(请参阅作用域)。 要连接的类应以“模块”的形式组织,可以是Scala trait , class...
全球资深Java技术专家的力作,系统、全面地讲解如何将模块化设计思想引入开发中,涵盖18个有助于实现模块化软件架构的模式 中文目录: 第一部分 模块化的理由 第1章 模块定义 1.1 定义模块 1.1.1 可部署 1.1.2...
全球资深Java技术专家的力作,系统、全面地讲解如何将模块化设计思想引入开发中,涵盖18个有助于实现模块化软件架构的模式 中文目录: 第一部分 模块化的理由 第1章 模块定义 1.1 定义模块 1.1.1 可部署 1.1.2 可...
RxJava是的Java VM实现:这是一个通过使用可观察的序列组成异步和基于事件的程序的库。 它扩展了以支持数据/事件序列,并添加了运算符,使您可以声明性地组成序列,同时抽象出对诸如低级线程,同步,线程安全和...
遗憾的是,在大多数实现中,模式匹配块不是一流的值。 Scala 在这方面进行了创新,将模式匹配块视为一流的值。 它通过为它们提供专用类型(称为PartialFunction )来实现这一点。 让我们看看这如何有用。 Scala 中的...
以编程语言实现的设计模式的示例,或在特定编程语言中看到的较小的本地化模式 什么是反模式? 反模式是模式的对立面; 虽然它也描述了对常见问题的重复解决方案,但该解决方案通常功能失调或无效,并对软件的“健康...
而策略模式中,策略容器(策略封装)并不知道内部策略的详细信息,因为容器并没有实现与内部策略相同的接口,即容器与内部策略只是简单的组合关系,容器只是将内部策略的行为抽取出来,进行了统一的实现。
功能数据验证 版权所有Dave Gurnell,2014年... 我们编写简单的功能代码来实现这些组合,并查看诸如monad之类的概念如何自然地从实现中落下。 最后,我着眼于将抽象提升到不同的级别,以创建简单的声明性DSL进行验证。
拥抱ReactiveX的异步性,实现并发性和实现独立性。 在Web上使用RxJS或在移动设备上使用Rx.NET和RxJava来处理UI事件和API响应。 避免使用复杂的有状态程序,对可观察的流使用干净的输入/输出功能。 ReactiveX的操作...
我们将介绍功能模式,例如Free Monad,Transformers,Kleisli箭头,依赖类型的检查异常和类型,以及如何将它们粘合在一起以实现可组合,上下文无关,可依赖注入和可测试的纯功能。 下载简报交互式:克隆此sbt ...
我们将介绍功能模式,例如免费Monad,联产品,隐式,Kleisli箭头,依赖类型的检查异常和类型,以及如何将它们粘合在一起以实现没有解释,可组合且容错的纯功能。 下载简报 交互式:克隆此sbt console并运行sbt ...
业余时,作为一个编程语言爱好者,对D、Kotlin、Lua、Clojure、Scala、Julia、Go等语言均有了解,但至今仍为Python独特的风格、简洁的设计而惊叹。 目录 · · · · · · 第1章 程序之道 1 1.1 什么是程序 1 ...