GoF设计模式 - 组合模式

Posted 让程序飞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GoF设计模式 - 组合模式相关的知识,希望对你有一定的参考价值。

前言

组合模式(Composite Pattern),将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。

 

组合模式主要包含三种角色:

  • 抽象根节点(Component):定义系统各层次对象的共有方法和属性,可以预先定义一些默认行为和属性;
  • 树枝节点(Composite):定义树枝节点的行为,存储子节点,组合树枝节点和叶子节点形成一个树形结构;
  • 叶子节点(Leaf):叶子节点对象,其下再无分支,是系统层次遍历的最小单位;

组合方式:

  • 透明模式:把组合(树节点)使用的方法放到统一行为(Component)中,让不同层次(树节点,叶子节点)的结构都具备一致行为
  • 安全模式:统一行为(Component)只规定系统各个层次的最基础的一致行为,而把组合(树节点)本身的方法(管理子类对象的添加,删除等)放到自身当中;

模式实现

 文件抽象节点类

public abstract class AbstractFile 

    String name;

    public AbstractFile(String name)
        this.name = name;
    

    /**
     * 添加文件
     * @param file 文件
     */
    public abstract void add(AbstractFile file);

    /**
     * 删除文件
     * @param file 文件
     */
    public abstract void remove(AbstractFile file);

    /**
     * 展示
     */
    public abstract void display();

    /**
     * 树形展示
     * @param depth 层级
     */
    public abstract void display(int depth);

文件类及文件夹类

public class Folder extends AbstractFile 

    private final List<AbstractFile> files = new ArrayList<>();
    ;

    public Folder(String name) 
        super(name);
    

    @Override
    public void add(AbstractFile file) 
        this.files.add(file);
    

    @Override
    public void remove(AbstractFile file) 
        this.files.remove(file);
    

    @Override
    public void display() 
        for (AbstractFile file : files) 
            file.display();
        
    

    @Override
    public void display(int depth) 
        for (int i = 0; i < depth; i++) 
            System.out.print('-');
        
        System.out.println(name);
        for (AbstractFile file : files) 
            file.display(depth + 1);
        
    

public class ImageFile extends AbstractFile

    public ImageFile(String name) 
        super(name);
    

    @Override
    public void add(AbstractFile file) 
        throw new UnsupportedOperationException("这个是叶子节点,无法增加");
    

    @Override
    public void remove(AbstractFile file) 
        throw new UnsupportedOperationException("这个是叶子节点,无法删除");
    

    @Override
    public void display() 
        System.out.println(name);
    

    @Override
    public void display(int depth) 
        for (int i = 0; i < depth; i++) 
            System.out.print('-');
        
        System.out.println(name);
    

package com.suiyun.combination.demo;

/**
 * 文本文件
 * @author ww
 */
public class TextFile extends AbstractFile 

    public TextFile(String name) 
        super(name);
    

    @Override
    public void add(AbstractFile file) 
        throw new UnsupportedOperationException("这个是叶子节点,无法增加");
    

    @Override
    public void remove(AbstractFile file) 
        throw new UnsupportedOperationException("这个是叶子节点,无法删除");
    

    @Override
    public void display() 
        System.out.println(name);
    

    @Override
    public void display(int depth) 
        for (int i = 0; i < depth; i++) 
            System.out.print('-');
        
        System.out.println(name);
    

测试类

class CombinationApplicationTests 

	@Test
	void contextLoads() 
		//创建顶级文件夹并添加 test.txt,test.png 以及子文件夹
		Folder folder = new Folder("顶级目录文件夹");
		folder.add(new TextFile("test.txt"));
		folder.add(new ImageFile("test.png"));

		Folder subFolder = new Folder("子文件夹");
		subFolder.add(new TextFile("subTest.txt"));
		folder.add(subFolder);

		folder.display(1);
	


 源码

组合模式示例(combination-demo)-Java文档类资源-CSDN下载

以上是关于GoF设计模式 - 组合模式的主要内容,如果未能解决你的问题,请参考以下文章

GoF设计模式 - 组合模式

GoF设计模式 - 组合模式

GoF设计模式 - 组合模式

java设计模式 GOF23 09 组合模式

设计模式之GOF23组合模式

GoF 23 种设计模式之享元模式和组合模式