设计模式----Composite(组合)模式

来源:互联网 发布:vwap算法 编辑:程序博客网 时间:2024/05/01 17:19

设计模式----Composite(组合)模式

 

GoF将对象组合合成树形结构以表示“部分--整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。

 

组合体内这些对象都有共同接口,当组合体一个对象的方法被调用执行时,Composite将遍历(Iterator)整个树形结构,寻找同样包含这个方法的对象并实现调用执行。可以用牵一动百来形容。

 

Composite模式描述了并实现了树形目录结构,在该模式中要有一个组合体,它是一个抽象类或接口(Component),组合体中定义足够多的方法。当组合体(Component)一个对象的方法被调用执行时,Composite将遍历(Iterator)整个树形结构,寻找同样包含这个方法的对象并实现调用执行。

 

Composite模式中要用到Iterator(迭代器)模式和Chain of Responsibility(职责链)模式。这两个模式我还没有学到,但是Java中的Iterator我用过。暂时先将Composite模式实现。

 

以组装电脑为例,首先需要一个组合体:

package Composite;

 

import java.util.Iterator;

 

public abstract class EquipmentComponent

{

    String E_name;

   

    public String getName()

    {

        return E_name;

    }//end getName(...)

   

    public void setName(String strName)

    {

        this.E_name = strName;

    }//end setName(...)

  

    public double getPrice(int eNumber, double price)

    {

        double equipmentPrice = 0;

        equipmentPrice = eNumber * price;

        return equipmentPrice;

    }//end getPrice()

   

    public abstract double equipmentPrice(int eNumber, double price);

   

    public boolean add(EquipmentComponent eq)

    {

        return false;

    }//end add(...)

   

    public boolean remove(EquipmentComponent eq)

    {

        return false;

    }//end remove(...)

   

    public Iterator iter()

    {

        return null;

    }//end iter()

}//end abstract class EquipmentComponent

 

接着我们实现一个软盘的类:

package Composite;

 

public class FloppyDisk extends EquipmentComponent

{

   

    public FloppyDisk()

    {

        //do something....

    }//end FloppyDisk()

   

    public double equipmentPrice(int eNumber, double price)

    {

        double equipmentPrice = getPrice(eNumber, price);

        return equipmentPrice;

    }//end equipmentPrice()

   

}//end class FloppyDisk

 

下面实现Composite类:

package Composite;

 

import java.util.ArrayList;

import java.util.Iterator;

 

public class EquipmentComposite extends EquipmentComponent

{

   

    /** Creates a new instance of EquipmentComposite */

    public EquipmentComposite()

    {

        //do something....

    }//end EquipmentComposite()

   

    private ArrayList equipment = new ArrayList();

   

    public double equipmentPrice(int eNumber, double price)

    {

        double equipmentPrice = 0;

        Iterator eIter = equipment.iterator();

        while(eIter.hasNext())

            equipmentPrice += ((EquipmentComponent)eIter.next()).getPrice(eNumber, price);

        return equipmentPrice;

    }//end equipmentPrice(...)

   

    public boolean add(EquipmentComponent eqc)

    {

        boolean addBool = equipment.add(eqc);

        if (addBool)

            return true;

        else

            return false;

    }//end add(...)

   

    public boolean remove(EquipmentComponent eqc)

    {

        if(equipment.size() == 0)

            return false;

        boolean removeBool = equipment.remove(eqc);

        if(removeBool)

            return true;

        else

            return false;

    }//end remove(...)

   

}//end class EquipmentComposite

 

接着实现一个箱子类:

package Composite;

 

public class Cabinet extends EquipmentComposite

{

    public Cabinet()

    {

        //do something....

    }//end Mosue()

   

    public double equipmentPrice(int eNumber, double price)

    {

        double chassisPrice = super.equipmentPrice(eNumber, price);

        return chassisPrice;

    }//end equipmentPrice(...)

   

}//class Cabinet

 

最后看看调用:

/*

 * CompositePattern.java

 *

 * Created on 2006330, 上午11:14

 *

 * To change this template, choose Tools | Template Manager

 * and open the template in the editor.

 */

 

package Composite;

 

/**

 *

 * @author Administrator

 */

public class CompositePattern

{

    Cabinet chassis = new Cabinet();

   

    /**

     * Creates a new instance of CompositePattern

     */

    public CompositePattern()

    {

        //do something....

    }//end CompositePattern()

   

    public void showCompositePattern()

    {

        chassis.setName("Power");

        String chassisName = chassis.getName();

        chassis.add(new FloppyDisk());

        double chassisPrice = chassis.equipmentPrice(1, 32.5);

        System.out.println("The chassis name is: " + chassisName);

        System.out.println("The chassis price is: " + chassisPrice);

    }//end showCompositePattern()

   

    public static void main(String[] args)

    {

        System.out.println("*--------------< Begin >-----------------*");

        System.out.println("The Composite Pattern!");

        CompositePattern cp = new CompositePattern();

        cp.showCompositePattern();

        System.out.println("*---------------< End >------------------*");

    }//end main(...)

   

}//end class CompositePattern

 

下面是Composite模式的UML图:

 

其中:

EquipmentComponent,为组合中的对象声明接口;在适当情况下实现所有类共有接口的缺省行为。

FloppyDisk,在组合中表示叶结点对象,叶结点没有子结点。

EquipmentComposite,定义有子部件的那些行为;存储子部件。

Chassis,子部件,用于存储叶结点。

在上例的代码中,我的实现非常的粗糙和不合理,但是已经表达出Composite模式的意思。以后在用到的时候要根据具体情况加以完善。

 

Composite模式是一种非常灵巧的模式,有些人说“设计模式不过是一种高超的编成技巧”,说这种话也是有一定道理的。只不过这种高超的技巧被上升为一种理论。并且实际大大提高了软件的合理性和强壮性。

 

论坛其实就是一个树形结构。在以后着手开发论坛的时候,我要尝试用用Composite模式。

 

 

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=968327