设计模式:组合模式

组合模式非java核心中的组合。

组合模式的定义:把部分和整体关系用“树形结构”来表示。从而使客户端可用同一方式处理部分对象或整体对象。

树形结构例子:比如平时的配置文件xml, 文件系统等

 

核心:

  抽象角色:定义了叶子和容器构件的共同点。如文件系统中文件和文件夹的特性。

  叶子构建角色(树的叶子):无子节点。如文件系统中的文件。

  容器构建角色:如文件系统中的文件夹。

组合模式使用户在使用时通过抽象角色一致处理容器和叶子。

当容器对象指定方法被调用时,将遍历整个树形结构。寻找包含这个方法的成员并调用执行。

例子:

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/**
 * 模拟杀毒软件
 * <p>
 * 抽象组件,
 */
public interface AbstraceFile {
 
    void scanVirus();
}
 
/**
 * 叶子组件
 * <p>
 * 文件。
 */
class TextFile implements AbstraceFile {
 
    private String name;
 
    public TextFile(String name) {
        this.name = name;
    }
 
    @Override
    public void scanVirus() {
        System.out.println("完成文本文件" + name + "扫描");
    }
}
 
/**
 * 容器组件
 * <p>
 * 文件夹
 */
class Folder implements AbstraceFile {
    private String name;
    private List<AbstraceFile> fileList;
 
    public Folder(String name) {
        this.name = name;
        fileList = new ArrayList<>();
    }
 
    /**
     * 这里包含一个天然递归方法
     */
    @Override
    public void scanVirus() {
        System.out.println("扫描文件夹");
        for (AbstraceFile file : fileList) {
            file.scanVirus();
        }
 
    }
 
    /**
     * 容器新增方法
     *
     * @param file
     */
    public void add(AbstraceFile file) {
        fileList.add(file);
    }
 
    /**
     * 容器新增方法
     *
     * @param file
     */
    public void remove(AbstraceFile file) {
        fileList.remove(file);
    }
}

  

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Client {
    public static void main(String[] args) {
        Folder file1 = new Folder("文件夹1");
        AbstraceFile file2 = new TextFile("文本文件1");
 
//        file2.scanVirus();
         
        file1.add(file2);
        //统一处理方式
        file1.scanVirus();
 
    }
}

  这里模拟了一个简单的文件扫描工具,先建立文件夹,和一些文件,使用统一的操作接口去操作文件和文件夹,进行扫描操作。

 

posted @   小阿Q的博客  阅读(165)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示