Composite (组合模式)
定义:允许你将对象组合成树型结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理 个别对象 以及 对象组合。
角色:
1) 抽象构建角色 (Component)
2) 叶子节点角色 (Leaf)
3) 组合构建角色 (Composite)
4) 客户端 (Client)
Component.java
- package com.composite ;
- import java.util.List ;
- //抽象构件角色
- public interface Component
- {
- public void add (Component component) ;
- public void remove (Component component) ;
- public void doSomeThing () ;
- public List<Component> getAll () ;
- }
Leaf.java
- package com.composite ;
- import java.util.List ;
- //叶子角色
- public class Leaf implements Component
- {
- public void add (Component component)
- {
- }
- public void remove (Component component)
- {
- }
- public List<Component> getAll ()
- {
- return null ;
- }
- public void doSomeThing ()
- {
- System.out.println("hello") ;
- }
- }
Composite.java
- package com.composite ;
- import java.util.List ;
- import java.util.ArrayList ;
- //组合角色
- public class Composite implements Component
- {
- private List<Component> list = new ArrayList<Component> () ;
- public void add (Component component)
- {
- list.add(component) ;
- }
- public void remove (Component component)
- {
- list.remove(component) ;
- }
- public List<Component> getAll ()
- {
- return this.list ;
- }
- //隐式递归 如果 遍历后发现component是叶子节点,则打印;反之,隐式递归
- public void doSomeThing ()
- {
- for (Component component : list)
- {
- component.doSomeThing() ;
- }
- }
- }
Client.java
- package com.composite ;
- //客户端角色
- public class Client
- {
- public static void main(String[] args)
- {
- //创建两个叶子构件
- Component leaf1 = new Leaf () ;
- Component leaf2 = new Leaf () ;
- //创建一个组合构件
- Component com1 = new Composite () ;
- com1.add (leaf1) ;
- com1.add (leaf2) ;
- //创建两个叶子构件
- Component leaf3 = new Leaf () ;
- Component leaf4 = new Leaf () ;
- //创建一个组合构件
- Component com2 = new Composite () ;
- //把第一个组件装进第二个组件里
- com2.add (com1) ;
- com2.add (leaf3) ;
- com2.add (leaf4) ;
- com2.doSomeThing () ;
- //com2.remove(com1) ;
- //com2.remove(leaf2) ;//在这移除不掉leaf2,只能com1.remove(leaf2)
- //System.out.println(com2.getAll()) ;
- }
- }
总结:
优点:
组合模式(Composite)可以让客户端的代码变的简单,不会那么繁琐,一致性的处理单个对象和组合对象
使用组合模式可以很好的增加新的叶子构件
缺点:
控制树枝节点构件不容易
你们都是有经验的开发人员