JAVA設計模式之【組合模式】


組合模式
	用面向對象的方式來處理樹形結構
	組合多個對象形成樹形結構以表示具有“整體-部分”關系的層次結構。
	在組合模式中引入了抽象構件類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'進行殺毒----


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM