设计模式一组合模式
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声明所有用来管理子类对象的方法。
组合模式的使用场景
在以下情况下应该考虑使用组合模式:
- 当想表达对象的部分-整体的层次结构时。
- 希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象时。
以上是关于设计模式一组合模式的主要内容,如果未能解决你的问题,请参考以下文章