欢迎来到Vincentyw的博客

该来的终究会来,该走的也一定会离开。凡事都存在前因后果,因缘成熟了,果报便产生了,无法阻挡。
但是发生过了就会消失,有来就有走,一切都是过客,把握自己当下的因缘,承担起自己该承担的责任,做好眼前该做的事情,做的时候尽全力,过去便放下,放下即自在。

设计模式之组合模式

Composite(组合模式)

一、组合模式简介

组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。

这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。

这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。

核心:

  • 1、抽象构件角色:定义叶子和容器构件的共同点
  • 2、叶子构件角色:无子节点
  • 3、容器构件角色:有容器特征,可包含子节点

二、组合模式优缺点比较

优点:

  • 1、高层模块调用简单
  • 2、节点自由增加

缺点:

  • 1、在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则

使用场景:

  • 1、树形菜单,文件、文件夹的管理
  • 2、XML文件解析、组织结构的管理(OA)、资源管理器

注意事项:定义时为具体类

三、UML类图

四、实现

  步骤1:创建抽象构件接口

/**
 * 抽象构件 : 定义叶子节点和容器节点构件的共同点
 * @author yw
 */
public interface AbstractFile {
    //文件杀毒
    public void killVirus(); 
}

 步骤2:创建实现抽象构件接口的叶子节点

/**
 * Leaf : 叶子节点,无子节点
 * @author yw
 */
public class TxtFile implements AbstractFile {
    private String name;
    
    public TxtFile(String name) {
        this.name = name;
    }

    @Override
    public void killVirus() {
        System.out.println("<<<文本文件:"+name+",进行查杀>>>");
    }
}

// * Leaf : 叶子节点,无子节点
public class VedioFile implements AbstractFile {
    private String name;
    
    public VedioFile(String name) {
        this.name = name;
    }

    @Override
    public void killVirus() {
        System.out.println("<<<视频文件:"+name+",进行查杀>>>");
    }
}

步骤3:创建实现抽象构件接口的容器构件

public class Folder implements AbstractFile {
    
    private String name;
    
    List<AbstractFile> lists = new ArrayList<>(); 
    
    public void add(AbstractFile file) {
        lists.add(file);
    }
    
    public void remove(AbstractFile file) {
        lists.remove(file);
    }
    
    public AbstractFile getFile(int index) {
        return lists.get(index);
    }
    
    public Folder(String name) {
        this.name = name;
    }

    @Override
    public void killVirus() {
        System.out.println("<<<文件夹:"+name+",进行查杀>>>");
        for (AbstractFile abstractFile : lists) {
            abstractFile.killVirus();
        }
    }
}

步骤4:调用者测试

public class CompositeDemo01 {
    public static void main(String[] args) {
        AbstractFile f2,f3,f4,f5;
        Folder f1 = new Folder("我的收藏夹");
        f2 = new TxtFile("menu.txt");
        f3 = new VedioFile("learn.avi");
        f1.add(f2);
        f1.add(f3);
        Folder f11 = new Folder("喜欢的电影");
        f4 = new VedioFile("无心法师.mp4");
        f5 = new VedioFile("斗破苍穹.mp4");
        f11.add(f4);
        f11.add(f5);
        f1.add(f11);
        f1.killVirus();
    }
}

步骤5:运行程序,观察结果

 

posted on 2020-04-01 22:15  VincentYew  阅读(272)  评论(0)    收藏  举报

导航