组合模式

来源:互联网 发布:手机画板软件哪个好 编辑:程序博客网 时间:2024/06/02 23:26

1.定义

将对象以树形结构组织起来,以达到“部分-整体”的层次结构,使得客户对单个对象和组合对象的使用具有一致性。

2.UML类图

角色说明:

抽象构件角色(Component):定义参加组合的对象的公共方法和属性,可以定义一些默认的行为或属性。

叶子构件(Leaf):叶子对象,其下没有分支。

树枝构件(Composiete):树枝对象,它的作用是组合树枝节点和树叶节点。

4.分类

透明模式:

该模式把用来组合使用的方法放到抽象类中,不管叶子对象还是树枝对象都有相同的结构。

安全模式:

该模式将树枝节点和树叶节点彻底分开,树枝节点单独拥有用来组合的方法。这样叶子节点和树枝节点不具有相同的接口了。

5.代码


package com.designpattern.composite;import java.util.Iterator;/** * 抽象构件 *  * @author wujinsong */public abstract class Equipment {    /**     * 设备名称     */    public String name;        public String getName() {        return name;    }        public void setName(String name) {        this.name = name;    }        /**     * 实际价格     *      * @return     */    public abstract double realPrice();        /**     * 折扣价     *      * @return     */    public abstract double discountPrice();        /**     * 增加部件     *      * @param equipment the Equipment 部件     * @return     */    public boolean add(Equipment equipment) {        return false;    }        /**     * 删除部件     *      * @param equipment the Equipment     * @return     */    public boolean remove(Equipment equipment) {        return false;    }        /**     * 提供遍历方法     *      * @return     */    public Iterator<Equipment> iterator() {        return null;    }        /**     * 构造函数     *      * @param name     */    public Equipment(final String name) {        this.name = name;    }}


package com.designpattern.composite;/** * 叶子构件 *  * @author wujinsong */public class Disk extends Equipment {        public Disk(String name) {        super(name);    }        @Override    public double realPrice() {        return 1.0;    }        @Override    public double discountPrice() {        return 0.5;    }    }


package com.designpattern.composite;import java.util.ArrayList;import java.util.Iterator;import java.util.List;/** * 树枝构件 *  * @author wujinsong */public class CompositeEquipment extends Equipment {    // 用来存放子对象    private List<Equipment> equipments = new ArrayList<Equipment>();        public CompositeEquipment(String name) {        super(name);    }        @Override    public double realPrice() {        double price = 0.0;                Iterator<Equipment> iterator = equipments.iterator();        while (iterator.hasNext()) {            price += ((Equipment) iterator.next()).realPrice();                        return price;        }        return 0;    }        @Override    public double discountPrice() {        double price = 0.0;                Iterator<Equipment> iterator = equipments.iterator();        while (iterator.hasNext()) {            price += ((Equipment) iterator.next()).discountPrice();                        return price;        }        return 0;    }        @Override    public boolean add(Equipment equipment) {        return equipments.add(equipment);    }        @Override    public boolean remove(Equipment equipment) {        return equipments.remove(equipment);    }        @Override    public Iterator<Equipment> iterator() {        return equipments.iterator();    }    }


package com.designpattern.composite;import java.util.Iterator;/** * 客户类 *  * @author wujinsong */public class Client {        public static void main(String[] args) {        CompositeEquipment root = new CompositeEquipment("电脑");        CompositeEquipment mainBoard = new CompositeEquipment("主板");        Disk disk1 = new Disk("disk1");        Disk disk2 = new Disk("disk2");        Disk disk3 = new Disk("disk3");                root.add(mainBoard);        root.add(disk3);        mainBoard.add(disk1);        mainBoard.add(disk2);                String info = search(root);        System.out.println(info);    }        /**     * 遍历     *      * @param root     */    public static String search(Equipment root) {        Iterator<Equipment> equipments = root.iterator();        String info = "";        while (equipments.hasNext()) {            Equipment equipment = (Equipment) equipments.next();            if (equipment instanceof Disk) {                info += equipment.getName() + "\n";            }            else {                info = info + equipment.getName() + "\n" + search(equipment);            }        }                return info;    }}



0 0
原创粉丝点击