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;
}
}