设计模式一组合模式
欢迎光临我的博客[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声明所有用来管理子类对象的方法。
组合模式的使用场景
在以下情况下应该考虑使用组合模式:
- 当想表达对象的部分-整体的层次结构时。
- 希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象时。