组合模式:是结构型模式中的对象结构型模式。将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式对单个对象的使用和组合对象的使用具有一致性。
组合模式的参与者:抽象构件类(Component),叶子构件类(leaf),树枝构件类(Composite),客户类(Client)
抽象构件类(Component):为组合中的对象声明接口,给出了共有的接口及默认行为。
叶子构件类(leaf):在组合对象中表示叶节点对象,叶节点没有子节点。
树枝构件类(Composite):表示组合对象中有子节点对象的对象。并给出了树枝构件对象的行为。
客户类(Client):通过Component操作组合部件的对象。
用户使用Component类接口与组合结构中的对象进行交互,如果接受者是一个叶节点,则直接出来请求,如果接收的是Composite,它通常将请求发给它的子部件,在转发请求之前或之后可能执行一些辅助操作。
合成模式可以不提供对父对象的管理,但是必须在合适的地方提供对子对象的管理方法。
合成模式根据所实现接口的区别分为二种形式,分别称为安全式和透明式。
透明式:在Component接口内声明所有的用来管理子类对象的方法。这样做的好处是所有构件类都有相同的接口。在客户端看来,叶节点对象和组合对象在接口层次上是没有区别的。客户端可以同等的对待所有的对象。透明式是不安全的,因为叶节点是没有子节点的,也就没有对子对象的管理方法的。
Component类:
public interface Component{
public Composite getCompesite();
public void sampleOperation();
//一些管理子对象的方法
}
Composite类:
Leaf类:
public class Leafimplements Component{
public Composite getCompesite(){
//返回自己的代码
}
public void sampleOperation(){
//商业方法
}
public class Composite implements Component{
public Composite getCompesite(){
//返回自己的代码
}
public void sampleOperation(){
//商业方法
}
//一些管理子对象的方法
public void add(Component component){
//相应代码
}
......
}
//一些管理子对象的方法
}
安全式:在Composite内声明了所有用来管理子对象的方法。这样的做法是安全的做法。缺点是不够透明,这样叶节点和合成类具有不同的接口。
Component类:
public interface Component{
public Composite getCompesite();
public void sampleOperation();
}
Composite类:
public class Composite implements Component{
public Composite getCompesite(){
//返回自己的代码
}
public void sampleOperation(){
//商业方法
}
//一些管理子对象的方法
public void add(Component component){
//相应代码
}
......
}
Leaf类:
public class Leafimplements Component{
public Composite getCompesite(){
//返回自己的代码
}
public void sampleOperation(){
//商业方法
}
}
以下情况使用组合模式:
(1)你想表示对象的部分-整体层次结构。
(2)你希望用户忽略组合对象和单个对象的不同,用户将统一的使用组合结构中的所有对象。
public void add(Component component){
//相应代码
}
......
public void add(Component component);
......