scala实现设计模式之组合模式

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

}

你可能感兴趣的:(scala实现设计模式之组合模式)