1、定义与结构
组合(Composite)模式的其它翻译名称也很多,比如合成模式、树模式等等。在《设计模式》一书中给出的定义是:将对象以树形结构组织起来,以达成“部分-整体”的层次结构,使得客户端对单个对象和组合对象的使用具有一致性。 从定义中可以得到使用组合模式的环境为:在设计中想表示对象的“部分-整体”层次结构;希望用户忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象。 看下组合模式的组成。 1) 抽象构件角色Component:它为组合中的对象声明接口,也可以为共有接口实现缺省行为。 2) 树叶构件角色Leaf:在组合中表示叶节点对象——没有子节点,实现抽象构件角色声明的接口。 3) 树枝构件角色Composite:在组合中表示分支节点对象——有子节点,实现抽象构件角色声明的接口;存储子部件。 下图为组合模式的类图表示。![](http://dl.iteye.com/upload/p_w_upload/155513/2200a09b-c6d4-3936-9021-4e8cb65e836e.bmp)
![](http://dl.iteye.com/upload/p_w_upload/155509/f6fc526e-1d77-3290-b3b9-578713a3a85d.bmp)
![](http://dl.iteye.com/upload/p_w_upload/155511/6d2bfe83-5612-35cc-a66b-be2a7b9614c3.bmp)
4、代码:
实现方式1:
申明接口:
- public interface Component {
- public void doSomething();
- }
具体实现:
- public class Leaf implements Component{
- @Override
- public void doSomething() {
- // TODO Auto-generated method stub
- System.out.println("执行方法..");
- }
- }
组合:
- public class Composite implements Component {
- public List<Component> components = new ArrayList<Component>();
- public void add(Component component) {
- components.add(component);
- }
- public void remove(Component component) {
- components.remove(component);
- }
- public List<Component> getAll() {
- return components;
- }
- @Override
- public void doSomething() {
- // TODO Auto-generated method stub
- for (Component component : components) {
- component.doSomething();
- }
- }
- }
测试:
- public static void main(String[] args) {
- Component leaf1 = new Leaf();
- Component leaf2 = new Leaf();
- Composite composite1 = new Composite();
- composite1.add(leaf1);
- composite1.add(leaf2);
- Component leaf3 = new Leaf();
- Component leaf4 = new Leaf();
- Composite composite2 = new Composite();
- composite2.add(composite1);
- composite2.add(leaf3);
- composite2.add(leaf4);
- composite2.doSomething();
- }
实现方式2:
各方法升级到接口中完成:
- public interface Component {
- public void doSomething();
- public void add(Component component);
- public void remove(Component component);
- public List<Component> getAll();
- }
叶子节点Leaf :除了做事情外,其他为空实现
- public class Leaf implements Component {
- @Override
- public void doSomething() {
- // TODO Auto-generated method stub
- System.out.println("do things...");
- }
- @Override
- public void add(Component component) {
- // TODO Auto-generated method stub
- }
- @Override
- public void remove(Component component) {
- // TODO Auto-generated method stub
- }
- @Override
- public List<Component> getAll() {
- // TODO Auto-generated method stub
- return null;
- }
- }
- public class Composite implements Component {
- private List<Component> components = new ArrayList<Component>();
- @Override
- public void doSomething() {
- // TODO Auto-generated method stub
- for (Component component : components) {
- component.doSomething();
- }
- }
- @Override
- public void add(Component component) {
- // TODO Auto-generated method stub
- components.add(component);
- }
- @Override
- public void remove(Component component) {
- // TODO Auto-generated method stub
- components.remove(component);
- }
- @Override
- public List<Component> getAll() {
- // TODO Auto-generated method stub
- return components;
- }
- }
测试:测试方式和方式1相同