设计模式之组合模式

一.组合模式的定义

组合模式将对象组合成树状结构以表示“整体-部分”的层次关系;

组合模式使得用户对单个对象和组合对象的访问具有一致性。

二.组合模式的角色及职责

1.Component

这是组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component子部件。

2.Leaf

在组合中表示叶子节点对象,叶子节点没有子节点。

3.Composite

定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关的操作,如增加(add)和删除(remove)等。

 

组合模式的UML图:

实例代码如下:

 1 public abstract class Component {
 2     private String name;
 3 
 4     public void setName(String name) {
 5         this.name = name;
 6     }
 7 
 8     public String getName() {
 9         return name;
10     }
11 
12     protected abstract void add(Component c);
13 
14     protected abstract void remove(Component c);
15 
16     protected abstract void display(int depth);
17 }
 1 public class Leaf extends Component {
 2 
 3     public Leaf(String name){
 4         setName(name);
 5     }
 6 
 7     @Override
 8     protected void add(Component c) {
 9         //叶子节点不能添加子节点,因此不做实现
10     }
11 
12     @Override
13     protected void remove(Component c) {
14         //叶子节点不能添加子节点,因此不做实现
15     }
16 
17     @Override
18     protected void display(int depth) {
19         String temp = "";
20         for (int i=0; i<depth; i++){
21             temp += "-";
22         }
23         System.out.println(temp + getName());
24     }
25 }
 1 public class Composite extends Component {
 2     private List<Component> children = new ArrayList<>();
 3 
 4     public Composite(String name){
 5         setName(name);
 6     }
 7 
 8     @Override
 9     protected void add(Component c) {
10         children.add(c);
11     }
12 
13     @Override
14     protected void remove(Component c) {
15         children.remove(c);
16     }
17 
18     @Override
19     protected void display(int depth) {
20         String temp = "";
21         for (int i=0; i<depth; i++){
22             temp += "-";
23         }
24         System.out.println(temp + getName());
25 
26         for (Component child : children){
27             child.display(depth + 2);
28         }
29     }
30 }

以下是测试类:

 1 public class CompositeTest {
 2 
 3     public static void main(String[] args) {
 4         Component root = new Composite("根节点");
 5 
 6         Component leftChild = new Composite("左节点");
 7         Component rightChild = new Composite("右节点");
 8 
 9         Component leftChild_1 = new Leaf("左节点-叶子1");
10         Component leftChild_2 = new Leaf("左节点-叶子2");
11 
12         Component rightChild_leaf = new Leaf("右节点—叶子");
13 
14         leftChild.add(leftChild_1);
15         leftChild.add(leftChild_2);
16 
17         rightChild.add(rightChild_leaf);
18 
19         root.add(leftChild);
20         root.add(rightChild);
21 
22         root.display(1);
23     }
24 
25 }

运行结果如下:

 

三.组合模式的使用场景

1.想要表示对象的整体-部分的层次结构。

2.希望用户忽略组合对象与单个对象的不同,用户将统一的使用组合结构中的所有对象。

posted @ 2016-10-10 20:07  GloryLee  阅读(919)  评论(0编辑  收藏  举报