组合模式
来源:互联网 发布:手机画板软件哪个好 编辑:程序博客网 时间: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
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- 组合模式
- HDU 4355 Party All the Time 三分
- 用lingo解决薪资分配问题
- C++之动态内存和引用
- 可以声明接口,但不可以new接口
- leetcode:Edit Distance
- 组合模式
- 梦想,在路上
- C++primer plus第六版课后编程题答案17.7
- 为什么很少有人在博客里写一些杂谈
- MPC8313ERDB从NAND FLASH中启动系统
- 关于linux下(自动)修改用户密码
- JS对象字面值编程--动态DOM框架例子
- java回调机制
- IT系统故障引起的一个事故的思考