设计模式之-------------组合模式

组合模式顾名思义就是将对象组合(一种递归组合),而对于用户来说,组合对象与普通对象的操作没有区别。举个例子形象点说:硬盘里的文件夹的组织方式就是组合模式,文件夹里可以包含文件与文件夹,文件夹里又可以包含文件夹。

组合模式是以后要讲的 装饰模式,组合的迭代器模式的基础,所以很重要。

当然,一图胜千言,上图!


从图上可以看出leaf类和composite类都是抽象类AbsytractComponent的子类。并且composite类与AbsytractComponent是组合的关系(即:composite类的对象能够包含AbsytractComponent类的对象,用上面文件夹的例子来解释的话,composite就是文件夹,leaf是具体文件,并且我们把文件和文件夹都抽象成组建--对应AbsytractComponent

下面上一段代码,来具体看一下组合模式的实现。

抽象组件类 File文件类

定义了添加组件,移除组件的方法。

public abstract class File {
         public abstract void add(File element);
	 public abstract void remove(File element);
}
具体组合类

注意其中定义了一个ArrayList用于存放组件对象。

class Folder extends File
{
	private ArrayList filelist=new ArrayList();
	private String fileName;
	public Folder(String filename)
	{
		this.fileName=filename;
	}
	public void add(File e)
	{
		filelist.add(e);
	}
	public void remove(File e)
	{
		filelist.remove(e);
	}
	
}
三个具体文件类

class ImageFile extends File
{
	private String fileName;
	public ImageFile(String filename)
	{
		this.fileName=filename;
	}
	public void add(File e)
	{
		System.out.println("对不起,不支持该方法");
	}
	public void remove(File e)
	{
		System.out.println("对不起,不支持该方法");
	}

}
class VideoFile extends File
{
	private String fileName;
	public VideoFile(String filename)
	{
		this.fileName=filename;
	}
	public void add(File e)
	{
		System.out.println("对不起,不支持该方法");
	}
	public void remove(File e)
	{
		System.out.println("对不起,不支持该方法");
	}

}
class TextFile extends File
{
	private String fileName;
	public TextFile(String filename)
	{
		this.fileName=filename;
	}
	public void add(File e)
	{
		System.out.println("对不起,不支持该方法");
	}
	public void remove(File e)
	{
		System.out.println("对不起,不支持该方法");
	}
		}
}
客户端代码便是先创建具体文件对象,然后再调用组合类对象的add方法来进行组合。要注意的是具体文件类虽然重写了add方法,但是它没有具体实现。

组合模式的优点主要有以下几个:
1、组合模式使得我们能够更加容易地定义层次复杂的对象。

2、对于用户来说,组合对象的操作和普通对象的操作时没有区别的。组合对象封装了对其包含的普通对象和组合对象的操作。(这有点递归的意思)。




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值