设计模式一组合模式


欢迎光临我的博客[http://poetize.cn],前端使用Vue2,聊天室使用Vue3,后台使用Spring Boot




概述

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

组合模式实现的最关键的地方是:

    简单对象和复合对象必须实现相同的接口。
    这就是组合模式能够将组合对象和简单对象进行一致处理的原因。



抽象构件(Component)角色:

它的主要作用是为树叶构件和树枝构件声明公共接口,并实现它们的默认行为。
树叶构件(Leaf)角色:
是组合中的叶节点对象,它没有子节点,用于实现抽象构件角色中声明的公共接口。
树枝构件(Composite)角色:
是组合中的分支节点对象,它有子节点。
它实现了抽象构件角色中声明的接口,它的主要作用是存储和管理子部件,
通常包含 Add()、Remove()、GetChild() 等方法。

1.透明方式:
      在该方式中,由于抽象构件声明了所有子类中的全部方法
所以客户端无须区别树叶对象和树枝对象,对客户端来说是透明的。
但其缺点是:树叶构件本来没有 Add()、Remove() 及 GetChild() 方法,
却要实现它们(空实现或抛异常),这样会带来一些安全性问题。
 1 import java.util.ArrayList;
 2 
 3 public class Composit {
 4     public static void main(String[] args) {
 5         Composite one = new Composite();
 6         Composite two = new Composite();
 7         one.add(two);
 8         Leaf aa = new Leaf("夏明");
 9         Leaf bb = new Leaf("小红");
10         Leaf cc = new Leaf("李华");
11         one.add(aa);
12         two.add(bb);
13         two.add(cc);
14         one.operation();
15         two.operation();
16     }
17 }
18 
19 interface Component {
20     public void add(Component c);
21 
22     public void remove(Component c);
23 
24     public Component getChild(int i);
25 
26     public void operation();
27 }
28 
29 class Composite implements Component {
30 
31     private ArrayList<Component> st = new ArrayList<>();
32 
33     @Override
34     public void add(Component c) {
35         st.add(c);
36     }
37 
38     @Override
39     public void remove(Component c) {
40         st.remove(c);
41     }
42 
43     @Override
44     public Component getChild(int i) {
45         return st.get(i);
46     }
47 
48     @Override
49     public void operation() {
50         for (int i = 0; i < st.size(); i++) {
51             Component component = st.get(i);
52             component.operation();
53         }
54     }
55 }
56 
57 class Leaf implements Component {
58 
59     private String name;
60 
61     public Leaf(String name) {
62         this.name = name;
63     }
64 
65     @Override
66     public void add(Component c) {
67     }
68 
69     @Override
70     public void remove(Component c) {
71     }
72 
73     @Override
74     public Component getChild(int i) {
75         return null;
76     }
77 
78     @Override
79     public void operation() {
80         System.out.println(name);
81     }
82 }

2.安全式组合模式
  在Component中不去声明Add和Remove方法,

  那么子类的Leaf就不需要实现它,而是在Composit声明所有用来管理子类对象的方法。

 

组合模式的使用场景

  在以下情况下应该考虑使用组合模式:

    1. 当想表达对象的部分-整体的层次结构时。
    2. 希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象时。
posted @ 2019-07-31 21:06  LittleDonkey  阅读(143)  评论(0编辑  收藏  举报