組合模式 用面向對象的方式來處理樹形結構 組合多個對象形成樹形結構以表示具有“整體-部分”關系的層次結構。 在組合模式中引入了抽象構件類Component,它是所有容器類和葉子類的公共父類。 角色 Component抽象構件 可以是接口或抽象類 為葉子構件和容器構件對象聲明接口 Leaf葉子構件 葉子節點沒有子節點 Composite容器構件 容器節點包含子節點,其子節點可以是葉子節點,也可以是容器節點。
殺毒軟件案例
1.抽象文件類
package Composite;
/**
* Created by Jiqing on 2016/10/5.
*/
abstract class AbstractFile {
public abstract void add(AbstractFile file);
public abstract void remove(AbstractFile file);
public abstract AbstractFile getChild(int i);
public abstract void killVirus();
}
2.Image文件類
package Composite;
/**
* Created by Jiqing on 2016/10/5.
*/
public class ImageFile extends AbstractFile{
private String name;
public ImageFile (String name) {
this.name = name;
}
public void add(AbstractFile file) {
System.out.println("對不起,不支持該方法!");
}
public void remove(AbstractFile file) {
System.out.println("對不起,不支持該方法!");
}
public AbstractFile getChild(int i) {
System.out.println("對不起,不支持該方法!");
return null;
}
public void killVirus() {
// 模擬殺毒
System.out.println("----對圖像文件'" + name + "'進行殺毒----");
}
}
3.文本文件類
package Composite;
/**
* Created by Jiqing on 2016/10/5.
*/
public class TextFile extends AbstractFile{
private String name;
public TextFile (String name) {
this.name = name;
}
public void add(AbstractFile file) {
System.out.println("對不起,不支持該方法!");
}
public void remove(AbstractFile file) {
System.out.println("對不起,不支持該方法!");
}
public AbstractFile getChild(int i) {
System.out.println("對不起,不支持該方法!");
return null;
}
public void killVirus() {
// 模擬殺毒
System.out.println("----對文本文件'" + name + "'進行殺毒----");
}
}
4.視頻文件類
package Composite;
/**
* Created by Jiqing on 2016/10/5.
*/
public class VideoFile extends AbstractFile{
private String name;
public VideoFile (String name) {
this.name = name;
}
public void add(AbstractFile file) {
System.out.println("對不起,不支持該方法!");
}
public void remove(AbstractFile file) {
System.out.println("對不起,不支持該方法!");
}
public AbstractFile getChild(int i) {
System.out.println("對不起,不支持該方法!");
return null;
}
public void killVirus() {
// 模擬殺毒
System.out.println("----對視頻文件'" + name + "'進行殺毒----");
}
}
5.文件夾類
package Composite;
import java.util.ArrayList;
/**
* Created by Jiqing on 2016/10/5.
*/
public class Folder extends AbstractFile{
private ArrayList<AbstractFile> fileList = new ArrayList<AbstractFile>(); // 規定集合中成員類型
private String name;
public Folder(String name) {
this.name = name;
}
public void add(AbstractFile file) {
fileList.add(file);
}
public void remove(AbstractFile file) {
fileList.remove(file);
}
public AbstractFile getChild(int i) {
return (AbstractFile)fileList.get(i); // 強制轉換為類型
}
public void killVirus() {
System.out.println("****對文件夾'" + name + "'進行殺毒****"); // 模擬殺毒
// 遞歸調用成員構件的殺毒方法
for (Object obj :fileList) {
((AbstractFile)obj).killVirus();
}
}
}
6.客戶端
package Composite;
/**
* Created by Jiqing on 2016/10/5.
*/
public class Client {
public static void main(String args[]) {
AbstractFile file1,file2,file3,file4,file5,folder1,folder2,folder3,folder4;
folder1 = new Folder("Jim的資料");
folder2 = new Folder("圖像文件");
folder3 = new Folder("文本文件");
folder4 = new Folder("視頻文件");
file1 = new ImageFile("小龍女.jpg");
file2 = new ImageFile("張無忌.gif");
file3 = new TextFile("九陰真經.txt");
file4 = new TextFile("葵花寶典.doc");
file5 = new VideoFile("笑傲江湖.rmvb");
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.killVirus();
}
}
執行結果
對文件夾'Jim的資料'進行殺毒
對文件夾'圖像文件'進行殺毒
----對圖像文件'小龍女.jpg'進行殺毒----
----對圖像文件'張無忌.gif'進行殺毒----
對文件夾'文本文件'進行殺毒
----對文本文件'九陰真經.txt'進行殺毒----
----對文本文件'葵花寶典.doc'進行殺毒----
對文件夾'視頻文件'進行殺毒
----對視頻文件'笑傲江湖.rmvb'進行殺毒----