组合模式用于组合多个对象形成树形结构以表示具有部分-整体关系的层次结构。组合模式让客户端可以统一对待单个对象和组合对象。组合模式又可以称为“部分-整体”模式,是一种对象结构型模式。
组合模式使用面向对象的思想来实现树形结构的构建与处理,描述了如何将容器对象和叶子对象进行递归组合,实现简单,灵活性好。
组合模式的结构与实现:
1.Component(抽象构件):可以为抽象类或接口,为叶子构件和容器构件对象声明接口,在该角色中可以包含所有子类共有行为的声明。在抽象构件中定义了访问及管理它的子构件的方法,如增加子构件,删除子构件,获取子构件等。
public abstract class Component {
public abstract void add(Component component);
public abstract void remove(Component component);
public abstract Component getChild(int node);
public abstract void operation();
}
2.Composite(容器构件):它在组合结构中表示容器结点对象,容器结点包含子节点,其子结点可以是叶子结点,也可以是容器结点,它提供一个集合用于储存子结点,实现了抽象构件中定义的行为,包括那些访问及管理子构件的方法,在其业务方法中可以递归调用子结点的业务方法。
public class Composite extends Component {
private List<Component> list=new ArrayList<>();
private String text;
public Composite(String text) {
this.text=text;
}
@Override
public void add(Component component) {
list.add(component);
}
@Override
public void remove(Component component) {
list.remove(component);
}
@Override
public Component getChild(int node) {
return list.get(node);
}
@Override
public void operation() {
System.out.println("获取到构件内容:"+text);
//递归调用构件的方法
for (Component component : list) {
component.operation();
}
}
}
3.Leaf(叶子构件):他在组合结构中表示叶子结点对象,叶子结点没有子节点,它实现了在抽象构件中定义的行为。对于那些访问及管理子构件的方法,可以通过抛出异常,提示错误等方式处理。
public class Leaf extends Component {
private String text;
public Leaf(String text) {
this.text=text;
}
@Override
public void add(Component component) {
// 错误提示
}
@Override
public void remove(Component component) {
// 错误提示
}
@Override
public Component getChild(int node) {
// 错误提示
return null;
}
@Override
public void operation() {
//叶子构件具体业务方法的实现
System.out.println("获取到叶子结点内容:"+text);
}
}
- Test:
public class Test {
public static void main(String[] args) {
Component component1,component2;
component1=new Composite("component1");
component2=new Composite("component2");
Component leaf1,leaf2,leaf3,leaf4;
leaf1=new Leaf("component1+leaf1");
leaf2=new Leaf("component1+leaf2");
leaf3=new Leaf("component2+leaf3");
leaf4=new Leaf("component2+leaf4");
component1.add(leaf1);
component1.add(leaf2);
component2.add(leaf3);
component2.add(leaf4);
component1.operation();
component2.operation();
}
}
运行内容:
获取到构件内容:component1
获取到叶子结点内容:component1+leaf1
获取到叶子结点内容:component1+leaf2
获取到构件内容:component2
获取到叶子结点内容:component2+leaf3
获取到叶子结点内容:component2+leaf4
网友评论