设计模式8——组合模式

1.生活实例

组合模式首先想到的就是树形结构,比如我们常用的文件结构,请看Windows的文件结构:

无论是文件或者是文件夹,常用操作都是一致的,比如:复制、粘贴、剪切、删除、所占空间大小。我们并没有刻意的去分他是文件夹还是文件。

我们可以把文件夹看成是组合对象,把每一个文件看成是单个对象。组合模式模糊了这两个概念,他使得客户端能够用简单一致的操作来操作两个不同的东西。

2.定义解析

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



Client:客户端。

Component:定义组合对象的接口。

Leaf:组合对象中的叶子,实现Component接口。

Composite:组合对象中的节点,组合所有叶子,实现Component接口,并且可以删除和增加叶子。

3.代码分析

Component

public interface Component {

	public void show();

	public void isChild(int pFatherLevel);

}

Composite

public class Composite implements Component {

	private String mName;
	private int mLevel;
	private ArrayList<Component> mList = new ArrayList<Component>();

	public Composite(String pName) {
		mName = pName;
		mLevel = 0;
	}

	public void add(Component pComponent) {
		pComponent.isChild(mLevel);
		mList.add(pComponent);
	}

	public void remove(Component pComponent) {
		mList.remove(pComponent);
	}

	@Override
	public void show() {
		showLevel();
		for (Component component : mList) {
			component.show();
		}
	}

	@Override
	public void isChild(int pFatherLevel) {
		mLevel = pFatherLevel + 1;
	}

	private void showLevel() {
		for (int i = 0; i < mLevel; i++) {
			System.out.print("-");
		}
		System.out.println(mName);
	}

}

Leaf

public class Leaf implements Component {

	private String mName;
	private int mLevel;

	public Leaf(String pName) {
		mName = pName;
		mLevel = 0;
	}

	@Override
	public void show() {
		showLevel();
	}

	@Override
	public void isChild(int pFatherLevel) {
		mLevel = pFatherLevel + 1;
	}

	private void showLevel() {
		for (int i = 0; i < mLevel; i++) {
			System.out.print("-");
		}
		System.out.println(mName);
	}

}

Client

public class CompositeTest {
	// 类似二叉树这样的结构

	public static void main(String[] args) {
		Composite composite1 = new Composite("节点1");
		Composite composite2 = new Composite("节点2");
		Leaf leaf1 = new Leaf("叶子1");
		Leaf leaf2 = new Leaf("叶子2");
		Leaf leaf3 = new Leaf("叶子3");
		Leaf leaf4 = new Leaf("叶子4");
		Leaf leaf5 = new Leaf("叶子5");

		composite1.add(leaf1);
		composite1.add(leaf2);
		composite1.add(composite2);
		composite2.add(leaf3);
		composite2.add(leaf4);
		composite2.add(leaf5);

		composite1.show();
	}

}

打印结果

节点1

-叶子1

-叶子2

-节点2

--叶子3

--叶子4

--叶子5

4.总结

           很久没写博客,捡起来。学如逆水行舟,不进则退。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值