组合模式

一、背景

       相信大家都熟悉我们的目录及文件结构,我们的目录里面可以存放目录和文件,每层目录都可以在其中创建目录或者文件,每层目录操作的方式都是一样的,使我们用起来更方便简洁。试想如果每层目录的操作方式不一样,那是得多麻烦。组合模式正是应对这样的问题。

二、概念

       组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。

三、代码实例

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

/**
 * 抽象角色,为组合对象提供一个统一接口
 */
abstract class Component {
	private String name;

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

	public abstract void add(Component c);

	public abstract void remove(Component c);

	public abstract void display();

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}

/**
 * 目录(支节点)
 * 
 */
class Catalog extends Component {
	/**
	 * 用来存放子目录或者文件
	 */
	private List<Component> compList = new ArrayList<Component>();

	public Catalog(String name) {
		super(name);
	}

	@Override
	public void add(Component c) {
		this.compList.add(c);
	}

	@Override
	public void remove(Component c) {
		this.compList.remove(c);
	}

	@Override
	public void display() {
		System.out.print(this.getName() + ":");
		for (int i = 0; i < compList.size(); i++) {
			if (i < compList.size() - 1) {
				System.out.print(compList.get(i).getName() + "-");
			} else {
				System.out.println(compList.get(i).getName());
			}
		}
	}
}

/**
 * 文件(叶子节点)
 * 
 */
class ComonFile extends Component {

	public ComonFile(String name) {
		super(name);
	}

	@Override
	public void add(Component c) {
		System.out.println("文件中不能添加目录或者文件");
	}

	@Override
	public void remove(Component c) {
		System.out.println("文件中不能删除目录或者文件");
	}

	@Override
	public void display() {
		System.out.println(this.getName());
	}
}

public class CompositePatternCli {
	public static void main(String[] args) {
		Component rootCataLog = new Catalog("根目录");
		rootCataLog.add(new ComonFile("文件1"));
		Catalog c1 = new Catalog("目录1");
		c1.add(new ComonFile("文件2"));
		rootCataLog.add(new Catalog("目录1"));
		rootCataLog.add(new Catalog("目录2"));
		rootCataLog.display();
	}
}

四、总结

      1.组合模式由三个角色构成,分别是 抽象组成对象,支节点,叶子节点。抽象组成对象提供一致使用,支节点存储其子节点和增加或者删除子节点。叶子节点不能再添加子节点。

2.组合模式解耦了客户程序与复杂元素内部结构,从而使客户程序像处理简单元素一样来处理复杂元素。

3.适用场景:如果想创建层次结构,且各层次结构的操作基本相同,那么可以考虑适用组合模式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值