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


一、意图


将对象组合成树形结构以表示“部分-整体”的层次结构。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


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: