e2

滴滴侠,fai抖

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

基础结构(伪码):

package composite_mode;

/**
 * 都是组件, 组件类型, 抽象组件
 * 组合模式非oo组合, 当涉及到对树形结构的处理时, 首先考虑到组合模式
 */
public interface Component {
    
    /**
     * 组件拥中的的方法
     */
    void operation();
    
}

/**
 * 叶子组件(底下不包含其它)
 */
interface Leaf extends Component {
}

/**
 * 容器组件(拥有孩子节点)
 */
interface Composite extends Component {
    
    /**
     * 增加组件
     */
    void add(Component c);
    
    /**
     * 删除组件
     */
    void remove(Component c);
    
    /**
     * 根据下标, 获得指定的组件
     */
    Component getChild(int index);
    
}

 

 

Demo:

文件类型:

package composite_mode;

/**
 * 文件类型(抽象构建)
 */
public interface AbstractFile {
    
    /**
     * 杀毒
     */
    public void killVirus();
    
}

 

图片文件:

package composite_mode;

/**
 * 图片文件
 * 图片文件下不包含其它, 本为叶子组件
 */
public class ImageFile implements AbstractFile {

    
    /**
     * 文件名
     */
    private String name;

    
    /**
     * 构造器(传入文件名)
     */
    public ImageFile(String name) {
        this.name = name;
    }

    
    /**
     * 杀毒
     */
    @Override
    public void killVirus() {
        System.out.println("---图像文件: " + name + ",进行查杀!");
    }
    
}

 

文本文件:

package composite_mode;

/**
 * 文本文件
 * 文本文件下不包含其它, 本为叶子组件
 */
public class TextFile implements AbstractFile {

    
    /**
     * 文件名
     */
    private String name;
    
    
    /**
     * 构造器(传入文件名)
     */
    public TextFile(String name) {
        this.name = name;
    }
    
    
    /**
     * 杀毒
     */
    @Override
    public void killVirus() {
        System.out.println("---文本文件: " + name + ",进行查杀!");
    }
    
}

 

视频文件:

package composite_mode;

/**
 * 视频文件
 * 视频文件下不包含其它, 本为叶子组件
 */
public class VideoFile implements AbstractFile {

    
    /**
     * 文件名
     */
    private String name;

    
    /**
     * 构造器(传入文件名)
     */
    public VideoFile(String name) {
        this.name = name;
    }
    
    
    /**
     * 杀毒
     */
    @Override
    public void killVirus() {
        System.out.println("---视频文件: " + name + ",进行查杀!");
    }
    
}

 

文件夹:

package composite_mode;

import java.util.ArrayList;
import java.util.List;

/**
 * 文件夹
 * 文件夹下会包含其它, 本为容器组件
 */
public class Folder implements AbstractFile {

    
    /**
     * 文件名
     */
    private String name;
    
    
    /**
     * 定义: 容器
     * 用于文件夹下存放文件(存放子节点)
     */
    private List<AbstractFile> list = new ArrayList<AbstractFile>();

    
    /**
     * 构造器(传入文件名)
     */
    public Folder(String name) {
        this.name = name;
    }
    
    
    /**
     * 文件夹里加文件
     * 容器中增加子节点
     */
    public void add(AbstractFile file){
        list.add(file);
    }
    
    
    /**
     * 文件夹里删文件
     * 容器中删除子节点
     */
    public void remove(AbstractFile file){
        list.remove(file);
    }
    
    
    /**
     * 文件夹里取文件
     * 容器中根据下标, 获得子节点
     */
    public AbstractFile getChild(int index){
        return list.get(index);
    }
    
    
    /**
     * 杀毒
     * 此处有天然的递归, 会遍历文件夹里的文件夹...
     */
    @Override
    public void killVirus() {
        System.out.println("---文件夹: " + name + ",进行查杀!");
        for (AbstractFile file : list) {
            file.killVirus();
        }
    }
    
}

 

测试类:

package composite_mode;

public class Client {
    
    public static void main(String[] args) {
        //声明文件类型
        AbstractFile f2, f3, f4, f5, f6;
        
        //创建f1文件夹
        Folder f1 = new Folder("我的收藏");
        
        //创建图片文件
        f2 = new ImageFile("老高的大头像.jpg");
        //创建文本文件
        f3 = new TextFile("Hello.txt");
        
        //f1文件夹里添加图片和文本
        f1.add(f2);
        f1.add(f3);
        
        //创建f11文件夹
        Folder f11 = new Folder("电影");
        
        //创建视频文件
        f4 = new VideoFile("aa.avi");
        f5 = new VideoFile("bb.avi");
        
        //f11文件夹里添加视频
        f11.add(f4);
        f11.add(f5);
        
        //f1文件夹里添加f11文件夹
        f1.add(f11);
        
        
        //f2.killVirus();
        
        //对f1文件夹杀毒
        f1.killVirus();
    }

}

 

执行结果:

---文件夹: 我的收藏,进行查杀!
---图像文件: 老高的大头像.jpg,进行查杀!
---文本文件: Hello.txt,进行查杀!
---文件夹: 电影,进行查杀!
---视频文件: aa.avi,进行查杀!
---视频文件: bb.avi,进行查杀!

 

 

谢谢声明出处!

转自: http://www.cnblogs.com/gscq073240/articles/7113201.html

 

posted on 2017-07-03 21:50  纯黑Se丶  阅读(145)  评论(0)    收藏  举报