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下载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
设计模式精解- GoF 23 种设计模式解析附 C++实现源码 目 录 0 引言 ..............................................................................................................................................2 0.1 设计模式解析(总序) .....................................................................................................2 0.2 设计模式解析后记.............................................................................................................2 0.3 与作者联系........................................................................................................................5 1 创建型模式...................................................................................................................................5 1.1 Factory模式 ........................................................................................................................5 1.2 AbstactFactory模式 ..........................................................................................................11 1.3 Singleton模式 ...................................................................................................................19 1.4 Builder模式.......................................................................................................................22 1.5 Prototype模式 ...................................................................................................................29 2 结构型模式.................................................................................................................................33 2.1 Bridge模式........................................................................................................................33 2.2 Adapter模式......................................................................................................................39 2.3 Decorator模式...................................................................................................................47 2.4 Composite模式 .............................................................................

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

让程序飞

您的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值