现在的位置: 首页 > 综合 > 正文

组合模式(Composite Pattern)(一):组合模式介绍

2018年02月04日 ⁄ 综合 ⁄ 共 1958字 ⁄ 字号 评论关闭

一、意图


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


二、适用性


• 你想表示对象的部分-整体层次结构。
• 你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。


三、组成


——抽象构件角色(Component):为组合中的对象声明接口, 在适当的情况下,也可实现所有类共有接口的缺省行为。

——树叶构件角色(Leaf):在组合中表示叶节点对象没有子节点,实现抽象构件角色声明的接口。

——树枝构件角色(Composite):在组合中表示分支节点对象,有子节点,实现抽象构件角色声明的接口;存储子部件。


四、两种实现方式


——透明式的组合模式:将管理子构件的方法定义在Component接口中,这样Leaf类就需要处理这些对其意义不大的方法(空实现或抛异常),在接口层次上Leaf和Composite没有区别,即透明性。Component 声明的些管理子构件的方法对于Leaf来说是不适用的这样也就带来了一些安全性问题。


——安全式的组合模式:将管理子构件的方法定义在Composite中,这样编译时任何从Leaf 中增加或删除对象的尝试都将被发现,但是由于Leaf和Composite有不同的接口(方法),又失去了透明性。


五、结构

六、简单实现

将管理子构件的方法定义在Composite中,即安全式的组合模式

1.Component

public interface Component
{
	public void doSomething();
}

2.Leaf

public class Leaf implements Component
{

	@Override
	public void doSomething()
	{
      System.out.println("Leaf doSomething");
	}

}

3.Composite

public class Composite implements Component
{
	List<Component> childs = new ArrayList<Component>();

	public void add(Component child)
	{
		this.childs.add(child);
	}

	public void remove(Component child)
	{
		this.childs.remove(child);
	}

	public Component getChild(int i)
	{
		return this.childs.get(i);
	}

	@Override
	public void doSomething()
	{
		for (Component child : childs)
			child.doSomething();
	}

}

4.Client

public class Client
{
	public static void main(String[] args)
	{
		/**
		 *           composite1
		 *           /      \
		 *        leaf1   composite2
		 *                  /   \
		 *               leaf2  leaf3        
		 *               
		 * */
		Component leaf1=new Leaf();
		Component leaf2=new Leaf();
		Component leaf3=new Leaf();
		Composite composite1=new Composite();
		Composite composite2=new Composite();
		
		composite2.add(leaf2);
		composite2.add(leaf3);
		composite1.add(leaf1);
		composite1.add(composite2);
		
		composite1.doSomething();
		
	}

}

七、其他


1.组合模式让我们能用树形方式创建对象的结构,树里面包含了Composite以及Leaf的对象。使用组合结构,我们能把相同的操作应用在Composite和Leaf上,即大多数情况下,我们可以忽略Composite和Leaf之间的差别,以相同的方式使用它们。为了保持透明性,Leaf和Composite都要继承或实现Component。


2.让管理子构件的方法如add()、remove()、getChild()等出现在Leaf中,是因为我们可以将Leaf看作是没有子构件的节点。


3.《设计模式》一书认为:在组合模式中,相对于安全性,我们比较强调透明性。对于透明式的组合模式中的Leaf内不需要的方法可以使用空处理或者异常报告的方式来解决。


4.Component中可以有一个指向父亲的指针,以便在游走时更容易。比如删除树形结构中的某个树或叶节点(即Composite或Leaf)时会更加方便。

转载请注明出处:http://blog.csdn.net/jialinqiang/article/details/8946607

抱歉!评论已关闭.