设计模式之组合模式

三、设计模式

22、组合模式(Composite Pattern)

22.1 定义

组合模式也叫合成模式,有时又叫做部分-整体模式,主要是用来描述部分与整体的关系,将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。

22.2 角色

  • Component(抽象构件角色):定义参加组合对象的共有方法和属性,可以定义一些默认的行为或属性。
  • Leaf(叶子构件):Leaf叶子构件叶子对象,其下再也没有其他的分支,也就是遍历的最小单位。
  • Composite(树枝构件):树枝对象,它的作用是组合树枝节点和叶子节点形成一个树形结构。组合模式的重点就在树枝构件。

22.3 结构图

22.4 代码实现

抽象文件
public interface AbstractFile {

	void operiation();
}
具体实现
public class ImageFile implements AbstractFile {

	private String name;

	public ImageFile(String name) {
		super();
		this.name = name;
	}


	[@Override](https://my.oschina.net/u/1162528)
	public void operiation() {
		System.out.println("图片文件:"+name+"处理操作");

	}

}
public class TextFile implements AbstractFile {

	private String name;


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


	[@Override](https://my.oschina.net/u/1162528)
	public void operiation() {
		System.out.println("文本文件:"+name+"处理操作");
	}

}
public class VideoFile implements AbstractFile {

	private String name;



	public VideoFile(String name) {
		super();
		this.name = name;
	}



	[@Override](https://my.oschina.net/u/1162528)
	public void operiation() {
		System.out.println("视频文件:"+name+"处理操作");
	}

}
文件夹
public class Folder implements AbstractFile {

	private String  name;

	private List<AbstractFile> list = new ArrayList<>();

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

	public void add(AbstractFile abstractFile) {
		list.add(abstractFile);
	}

	public void remove(AbstractFile abstractFile) {
		list.remove(abstractFile);
	}

	public AbstractFile getChild(int index) {
		return list.get(index);
	}

	[@Override](https://my.oschina.net/u/1162528)
	public void operiation() {
		System.out.println("处理"+name +"文件");
		for(AbstractFile file:list) {
			file.operiation();
		}

	}
}
测试类
class Test {

	@org.junit.jupiter.api.Test
	void test() {
		AbstractFile textFile,imageFile,videoFile;
		textFile = new TextFile("aaa.txt");
		imageFile = new ImageFile("bbb.png");
		videoFile = new VideoFile("ccc.mp4");

		Folder folder = new Folder("D://");
		folder.add(textFile);
		folder.add(imageFile);
		folder.add(videoFile);

		Folder folder2 = new Folder("C:");
		folder2.add(videoFile);
		folder2.add(imageFile);
		folder2.add(textFile);

		folder2.add(folder);
		folder2.operiation();

	}

}
控制台

22.5 优点

  • 高层模块调用简单。局部和整体对调用者来说没有任何区别,也就是说,高层模块不必关心自己处理的是单个对象还是整个组合结构,简化了高层模块的代码。
  • 节点自由增加。使用了组合模式后,我们可以看看,如果想增加一个树枝节点、树叶节点十分简单,只要找到它的父节点就成,非常容易扩展,符合开闭原则,对以后的维护非常有利。

22.6 缺点

  • 组合模式有一个非常明显的缺点,在上面的场景类可以看到树枝树叶直接使用了实现类,这在面向接口编程上是很不恰当的,与依赖倒置原则冲突,它限制了你接口的影响范围

转载于:https://my.oschina.net/tcwong/blog/3057177

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值