设计模式-组合模式

来源:互联网 发布:淘宝微任务平台 编辑:程序博客网 时间:2024/04/27 19:44

出处:http://blog.chinaunix.net/uid-23637692-id-3789442.html

定义:

又叫做部分-整体模式,一般用来处理类似树形结构的问题。它模糊处理元素与部分整体,使得客户端能够统一处理简单或者复杂的元素,从而使得客户端程序同元素的结构之间解耦。

作用:

  1. 统一元素与部分整体,简化处理代码
  2. 将元素内部结构同处理程序解耦,从而一致的对待元素与部分整体。

实际上,组合模式在应用中其实非常广泛,像文件系统、企业结构等都可以看做是组合模式的典型应用。
                                                
                                                                                             图1 Linux文件系统结构
                                                                            
                                                                                         图2 组合模式组成图
Component:定义成接口或者抽象类,是元素与不部分整体的父类。

Leaf:叶子节点,定义了基本元素的特征,继承自Component父类,是整体最基本的组成部分。

Composite:部分整体或者容器,继承或实现自Component父类。内部包含Composite或者Leaf的聚合,用来保存内部的组织结构,并且针对该聚合有相应的操作方法。

组合模式关键定义了一个抽象类或者接口,既可以代表元素又可以代表部分整体,而客户端是针对该接口进行编程。因此,客户端不需要知道是元素还是部分整体,对其统一进行处理。

下面具体看一下代码示例:

Component接口:

  1. public interface Component {

  2.     public void add(Component e);
  3.     
  4.     public void del(Component e);
  5.     
  6.     public Component get(int i);
  7.     
  8.     public void operate();
  9. }
 元素节点 Leaf:
  1. public class Leaf implements Component {

  2.     private String name;
  3.     public String getName() {
  4.         return name;
  5.     }

  6.     public void setName(String name) {
  7.         this.name = name;
  8.     }

  9.     @Override
  10.     public void add(Component e) {
  11.     }

  12.     @Override
  13.     public void del(Component e) {
  14.     }

  15.     @Override
  16.     public Component get(int i) {
  17.         return null;
  18.     }

  19.     @Override
  20.     public void operate() {
  21.         System.out.println(name);
  22.     }
  23. }

部分整体Composite:

  1. public class Composite implements Component {

  2.     private List<Component> list = new ArrayList();
  3.     
  4.     @Override
  5.     public void add(Component e) {
  6.          list.add(e);
  7.     }

  8.     @Override
  9.     public void del(Component e) {
  10.         list.remove(e);
  11.     }

  12.     @Override
  13.     public Component get(int i) {
  14.         return list.get(i);
  15.     }

  16.     @Override
  17.     public void operate() {
  18.         
  19.         Iterator it = list.iterator();
  20.         while(it.hasNext()){
  21.             Component component = (Component) it.next();
  22.             component.operate();
  23.         }
  24.     }
  25. }

客户端代码调用:

  1. public class Customer {

  2.     public static void main(String[] args) {

  3.         Leaf leaf1 = new Leaf();
  4.         leaf1.setName("leaf1");
  5.         Leaf leaf2 = new Leaf();
  6.         leaf2.setName("leaf2");
  7.         Leaf leaf3 = new Leaf();
  8.         leaf3.setName("leaf3");
  9.         Leaf leaf4 = new Leaf();
  10.         leaf4.setName("leaf4");
  11.         Leaf leaf5 = new Leaf();
  12.         leaf5.setName("leaf5");
  13.         
  14.         Composite composite1 = new Composite();
  15.         Composite composite2 = new Composite();
  16.         Composite composite3 = new Composite();

  17.         composite3.add(leaf5);
  18.         composite2.add(composite3);
  19.         composite2.add(leaf4);
  20.         composite2.add(leaf3);
  21.         composite1.add(composite2);
  22.         composite1.add(leaf2);
  23.         composite1.add(leaf1);
  24.         
  25.         composite1.operate();
  26.     }
  27. }

输出结果:

  1. leaf5
  2. leaf4
  3. leaf3
  4. leaf2
  5. leaf1
客户端代码可以轻松的调用组合对象的方法,不管里面的元素的个数有多少,树形组织结构如何,客户端都只用相同的代码便可,不用修改原有的代码。

模式适用环境
1. 在对象与部分整体之间,想要通过统一的方式对其进行处理,模糊处理其差异的时候可以选用组合模式
2. 当客户端忽视结构层次,无差异的看待元素与部分整体,不关心元素和部分整体之间的层次结构,想要实现对统一接口编程的时候
3. 对象的变化是动态,而客户端想要一致的处理对象的时候
综上,在上述3种情况下可以考虑使用组合模式来设计系统程序。
0 0