设计模式一组合模式

Posted loveer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式一组合模式相关的知识,希望对你有一定的参考价值。

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

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

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



抽象构件(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. 希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象时。
 

以上是关于设计模式一组合模式的主要内容,如果未能解决你的问题,请参考以下文章

java设计模式5.组合模式门面模式享元模式桥接模式

Head First设计模式之组合模式

设计模式——组合模式

java设计模式--组合模式

15组合模式

设计模式之组合模式