设计模式12 组合模式

组合模式定义:组合模式又叫作“部分-整体”模式,它是一种将对象组合成树状的层次结构的模式,用来表示“部分-整体”的关系。使用户对单个对象和组合对象具有一致的访问性。

如图左边是:组合模式;右边是:装饰者模式

可见组合模式就是装饰者模式的上半部分。

组合模式的优点有:

1、组合模式使得客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象,还是组合对象,这简化了客户端代码;

2、更容易在组合体内加入新的对象,客户端不会因为加入了新的对象而更改源代码,满足“开闭原则”;

组件接口:

1 public interface Component {
2     public void add(Component component);
3 
4     public void remove(Component component);
5 
6     public Component getChild(int t);
7 
8     public void operation();
9 }

树叶元素与组合元素:

 1 public class Leaf implements Component {
 2     private String name;
 3 
 4     public Leaf(String name) {
 5         this.name = name;
 6     }
 7 
 8     @Override
 9     public void add(Component component) {
10         // TODO Auto-generated method stub
11 
12     }
13 
14     @Override
15     public void remove(Component component) {
16         // TODO Auto-generated method stub
17 
18     }
19 
20     @Override
21     public Component getChild(int t) {
22         // TODO Auto-generated method stub
23         return null;
24     }
25 
26     @Override
27     public void operation() {
28         // TODO Auto-generated method stub
29         System.out.println("树叶" + name + "被访问");
30     }
31 }
32 
33 public class Composite implements Component {
34     private ArrayList<Component> children = new ArrayList<Component>();
35 
36     @Override
37     public void add(Component component) {
38         // TODO Auto-generated method stub
39         children.add(component);
40     }
41 
42     @Override
43     public void remove(Component component) {
44         // TODO Auto-generated method stub
45         children.remove(component);
46     }
47 
48     @Override
49     public Component getChild(int t) {
50         // TODO Auto-generated method stub
51         return children.get(t);
52     }
53 
54     @Override
55     public void operation() {
56         // TODO Auto-generated method stub
57         for (Object obj : children) {
58             ((Component) obj).operation();
59         }
60     }
61 }

调用方式:

 1 public class Client {
 2     public static void main(String[] args) {
 3         Component c0 = new Composite();
 4         Component c1 = new Composite();
 5         Component leaf1 = new Leaf("1");
 6         Component leaf2 = new Leaf("2");
 7         Component leaf3 = new Leaf("3");
 8         c0.add(leaf1);
 9         c0.add(c1);
10         c1.add(leaf2);
11         c1.add(leaf3);
12         c0.operation();
13     }
14 }

执行结果:

组合模式是数据结构的体现。

原文地址:https://www.cnblogs.com/asenyang/p/12111055.html