设计模式(六)学习----组合模式

待补充图,定义等。

1.为组合中的对象申明接口
package desigh.commands.composites;

/**
 * 
 *
 * @author lipeng24@meituan.com
 * @create 2017-10-26 下午7:56
 **/

public interface ComponentFile {
    /**
     * 操作文件
     */
    void operate();

    /**
     * 钩子函数,判断是否是文件
     *
     * @return
     */
    boolean isFile();
}

 

package desigh.commands.composites;

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

/**
 *
 *
 *
 * ComponentFile文件夹,
 * <p>
 * 1.容器对象,用于存储子部件,比如文本文件,图像文件,视频文件
 * 2.实现与子部件有关的行为操作(例如增加,删除操作)
 * 3.定义有子部件的那些行为
 *
 * ComponentFile
 *
 * 1.为组合中的对象声明接口(文件对象)
 *
 * ImageFileLeaf,TextFileLeaf,VideoFileLeaf叶子节点
 * 1.叶子节点没有子节点,表示叶子对象
 *

 *
 * 参考项目中的ticket_order项目的:
 *
 * 组合对象中声明的接口的方法
 * //1.Component
 * Logic
 * //2.composite 组合对象
 * CompositeLogic
 * //3.leaf 叶子节点
 * ACKSuccessLogicUnit
 *
 *
 * @author lipeng24@meituan.com
 * @create 2017-10-26 下午8:03
 **/

public class CompositeFolder implements ComponentFile {
    private String name;
    public CompositeFolder(String name) {
        this.name = name;
    }

    private List<ComponentFile> childFiles = new ArrayList<>();

    /**
     * ComponentFile 中子部件共有的行为
     */
    @Override
    public void operate() {
        for (ComponentFile file : childFiles) {
            if (file.isFile()) {
                file.operate();
            } else {
                System.out.println("this is not a file");
            }
        }
    }

    @Override
    public boolean isFile() {
        return true;
    }

    /**
     * 添加文件
     *
     * @param file
     */
    public void addFile(ComponentFile file) {
        childFiles.add(file);
    }

    /**
     * 添加文件
     *
     * @param file
     */
    public void removeFile(ComponentFile file) {
        childFiles.remove(file);
    }

}

 

2.实现类:

package desigh.commands.composites;

/**
 * 图像文件叶子节点
 *
 * @author lipeng24@meituan.com
 * @create 2017-10-26 下午8:34
 **/

public class ImageFileLeaf implements ComponentFile {

    private String name;

    public ImageFileLeaf(String name) {
        this.name = name;
    }

    @Override
    public void operate() {
        System.out.println("操作的是图像文件" + name);
    }

    @Override
    public boolean isFile() {
        return true;
    }
}

 

package desigh.commands.composites;

/**
 * 文件叶子节点
 *
 * @author lipeng24@meituan.com
 * @create 2017-10-26 下午8:32
 **/

public class TextFileLeaf implements ComponentFile {

    private String name;

    public TextFileLeaf(String name) {
        this.name = name;
    }

    @Override
    public void operate() {
        System.out.println("操作的是文本文件:" + name);
    }

    @Override
    public boolean isFile() {
        return true;
    }
}

 

package desigh.commands.composites;

/**
 * 音频文件叶子节点,叶子节点没有子节点
 *
 * @author lipeng24@meituan.com
 * @create 2017-10-26 下午8:36
 **/

public class VideoFileLeaf implements ComponentFile {

    private String name;

    public VideoFileLeaf(String name) {
        this.name = name;
    }

    @Override
    public void operate() {
        System.out.println("操作的是音频文件" + name);
    }

    @Override
    public boolean isFile() {
        return true;
    }
}

 

 * 优点:
 * 1.各个叶子节点足够内聚
 * 2.客户端实现简单,可以一直的使用组合对象和单个对象
 * 3.可以面向顶层接口,统一做一些事情(eg.是否可降级,是否可异步处理,日志aop等等)
 * 4.对扩展开放,很容易的可以在组合对象内加入单个对象, 而客户端不必修改原有代码
 *
 * 使用场景:
 *
 * 1.想表示对象的整体和部分的层次,并且在此结构中,希望通过一种方式忽略整体和部分的差异
 * 2.希望用户忽略组合对象和单个对象的不同,用户将统一的使用结构中的所有对象。
 * 3.可以结合责任链模式,迭代器,装饰器,享元,访问者模式一块使用。

 

 

参考:
* 1.https://en.wikipedia.org/wiki/Composite_pattern
* 2.https://foolchild.cn/2016/07/26/composite
* 3.http://www.cnblogs.com/chenssy/p/3299719.html

 

posted @ 2018-01-03 10:21  积淀  阅读(158)  评论(0编辑  收藏  举报