当前位置:编程学习 > JAVA >>

《JAVA与模式》第8天—合成模式

合成模式属于对象的结构模式,有时又叫做“部分——整体”模式。合成模式将对象组织到树结构中,可以用来描述整体与部分的关系。合成模式可以使客户端将单纯元素与复合元素同等看待。

 

--------------------------------------------------------------------------------

合成模式

  合成模式把部分和整体的关系用树结构表示出来。合成模式使得客户端把一个个单独的成分对象和由它们复合而成的合成对象同等看待。

  比如,一个文件系统就是一个典型的合成模式系统。下图是常见的计算机XP文件系统的一部分。

 \

  从上图可以看出,文件系统是一个树结构,树上长有节点。树的节点有两种,一种是树枝节点,即目录,有内部树结构,在图中涂有颜色;另一种是文件,即树叶节点,没有内部树结构。

  显然,可以把目录和文件当做同一种对象同等对待和处理,这也就是合成模式的应用。

  合成模式可以不提供父对象的管理方法,但是合成模式必须在合适的地方提供子对象的管理方法,诸如:add()、remove()、以及getChild()等。

  合成模式的实现根据所实现接口的区别分为两种形式,分别称为安全式和透明式。

安全式合成模式的结构
  安全模式的合成模式要求管理聚集的方法只出现在树枝构件类中,而不出现在树叶构件类中。

 \

  这种形式涉及到三个角色:

  ●  抽象构件(Component)角色:这是一个抽象角色,它给参加组合的对象定义出公共的接口及其默认行为,可以用来管理所有的子对象。合成对象通常把它所包含的子对象当做类型为Component的对象。在安全式的合成模式里,构件角色并不定义出管理子对象的方法,这一定义由树枝构件对象给出。

  ●  树叶构件(Leaf)角色:树叶对象是没有下级子对象的对象,定义出参加组合的原始对象的行为。

  ●  树枝构件(Composite)角色:代表参加组合的有下级子对象的对象。树枝构件类给出所有的管理子对象的方法,如add()、remove()以及getChild()。

源代码
 抽象构件角色类

[java]
package com.bankht.Composite; 
 
/**
 * @author: 特种兵—AK47
 * @创建时间:2012-6-25 下午09:56:57
 * 
 * @类说明 :抽象构件角色类
 */ 
public interface Component { 
    /**
     * 输出组建自身的名称
     */ 
    public void printStruct(String preStr); 

package com.bankht.Composite;

/**
 * @author: 特种兵—AK47
 * @创建时间:2012-6-25 下午09:56:57
 *
 * @类说明 :抽象构件角色类
 */
public interface Component {
 /**
  * 输出组建自身的名称
  */
 public void printStruct(String preStr);
}
 

 

 树枝构件角色类

[java] 
package com.bankht.Composite; 
 
import java.util.ArrayList; 
import java.util.List; 
 
/**
 * @author: 特种兵—AK47
 * @创建时间:2012-6-25 下午09:57:27
 * 
 * @类说明 :树枝构件角色类
 */ 
public class Composite implements Component { 
    /**
     * 用来存储组合对象中包含的子组件对象
     */ 
    private List<Component> childComponents = new ArrayList<Component>(); 
    /**
     * 组合对象的名字
     */ 
    private String name; 
 
    /**
     * 构造方法,传入组合对象的名字
     * 
     * @param name
     *            组合对象的名字
     */ 
    public Composite(String name) { 
        this.name = name; 
    } 
 
    /**
     * 聚集管理方法,增加一个子构件对象
     * 
     * @param child
     *            子构件对象
     */ 
    public void addChild(Component child) { 
        childComponents.add(child); 
    } 
 
    /**
     * 聚集管理方法,删除一个子构件对象
     * 
     * @param index
     *            子构件对象的下标
     */ 
    public void removeChild(int index) { 
        childComponents.remove(index); 
    } 
 
    /**
     * 聚集管理方法,返回所有子构件对象
     */ 
    public List<Component> getChild() { 
        return childComponents; 
    } 
 
    /**
     * 输出对象的自身结构
     * 
     * @param preStr
     *            前缀,主要是按照层级拼接空格,实现向后缩进
     */ 
    @Override 
    public void printStruct(String preStr) { 
        // 先把自己输出  
        System.out.println(preStr + "+" + this.name); 
        // 如果还包含有子组件,那么就输出这些子组件对象  
        if (this.childComponents != null) { 
            // 添加两个空格,表示向后缩进两个空格  
            preStr += "  "; 
            // 输出当前对象的子对象  
            for (Component c : childComponents) { 
                // 递归输出每个子对象  
                c.printStruct(preStr); 
            } 
        } 
 
    } 
 

package com.bankht.Composite;

import java.util.ArrayList;
import java.util.List;

/**
 * @author: 特种兵—AK47
 * @创建时间:2012-6-25 下午09:57:27
 *
 * @类说明 :树枝构件角色类
 */
public class Composite implements Component {
 /**
  * 用来存储组合对象中包含的子组件对象
  */
 private List<Component> childComponents = new ArrayList<Component>();
 /**
  * 组合对象的名字
  */
 pr

补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,