欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

设计模式(八: 结构型模式----组合模式(composite))

程序员文章站 2022-06-13 12:55:34
...

1.使用组合模式的场景:
把部分和整体的关系用树形结构来表示,从而使客户端可以使用统一的方 式处理部分对 象和整体对象。
2. 组合模式核心:
抽象构件(Component)角色: 定义了叶子和容器构件的共同点
叶子(Leaf)构件角色:无子节点
容器(Composite)构件角色: 有容器特征,可以包含子节点
3.组合模式工作流程分析:
– 组合模式为处理树形结构提供了完美的解决方案,描述了如何将容器和叶子进行递归组 合,使得用户在使用时可以一致性的对待容器和叶子。
– 当容器对象的指定方法被调用时,将遍历整个树形结构,寻找也包含这个方法的成员, 并调用执行。其中,使用了递归调用的机制对整个结构进行处理。
4.代码案例:使用组合模式,模拟杀毒软件架构设计

package com.example.shejimoshi.composite;

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

/**
 * 定义抽象构建
 */
public interface AbstactFile {

    //杀毒
    void shaDu();
}

/**
 * 杀图片文件
 * 属于叶子
 */
class ImgageFile implements AbstactFile {

    private String name;

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

    @Override
    public void shaDu() {
        System.out.println("正在查杀"+name+"图片文件");
    }
}



/**
 * 杀文本文件
 * 属于叶子
 */
class TextFile implements AbstactFile {

    private String name;

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

    @Override
    public void shaDu() {
        System.out.println("正在查杀"+name+"文本文件");
    }
}

/**
 * 杀视频文件
 * 属于叶子
 */
class ShiPingile implements AbstactFile {

    private String name;

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

    @Override
    public void shaDu() {
        System.out.println("正在查杀"+name+"视频文件");
    }
}

/**
 * 容器构建 可能有子文件
 */
class Folder implements AbstactFile
{
    private  String name;

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

    /**
     * 这个容器存这个容器构建下面的子节点
     */
    private List<AbstactFile> list =new ArrayList<AbstactFile>();

    /**
     * 为容器增加子节点
     * @param abstactFile
     */
    public void  add(AbstactFile abstactFile)
    {
        list.add(abstactFile);
    }

    /**
     * 为容器删除子节点
     * @param abstactFile
     */
    public void  remove(AbstactFile abstactFile)
    {
        list.remove(abstactFile);
    }

    /**
     * 查找容器子节点
     * @param index
     * @return
     */
    public AbstactFile getChild(int index)
    {
      return list.get(index);
    }

    @Override
    public void shaDu() {
        System.out.println("文件夹"+name+"正在查杀");
        for (AbstactFile abstactFile :list)
        {
            //天然的递归
            abstactFile.shaDu();
        }
    }
}

测试:

package com.example.shejimoshi.composite;

public class Test {

    public static void main(String[] args) {
        AbstactFile f2,f3,f4,f5;

        Folder f1 = new Folder("我的收藏");
        f2 =new ImgageFile("133.jps");
        f3 =new TextFile("123.txt");
        f1.add(f2);
        f1.add(f3);

        Folder f11 = new Folder("电影");
        f4 =new ShiPingile("笑傲.mp4");
        f5 =new ShiPingile("笑傲2.mp4");
        f11.add(f4);
        f11.add(f5);
        f1.add(f11);
        f1.shaDu();




    }
}

执行结果:把树形结构的数据全部杀设计模式(八: 结构型模式----组合模式(composite))

5.开发中的应用场景:
1.XML文件解析
2.Junit单元测试框架