模式概述:
你可以使用它将对象组合成树状结构, 并且能像使用独立对象一样使用它们。
使用场景:
1.如果你需要实现树状对象结构, 可以使用组合模式。
2.如果你希望客户端代码以相同方式处理简单和复杂元素, 可以使用该模式。
代码样例:
代码背景: 组合模式主要是用于树状结构;以下代码是模拟买水果的场景,每种水果是叶子节点(简单元素);水果需要袋子包装,使用袋子包装好水果的组合是复杂元素,一些包装好水果的袋子可能和其他水果或者袋子又被大的袋子再次包装。
/**
* 抽象产品元素
*/
public abstract class ProductComponent {
public String name;
public long price;
public ProductComponent(String name, long price){
this.name=name;
this.price = price;
}
public abstract boolean add(ProductComponent productComponent);//添加元素
public abstract boolean remove(ProductComponent productComponent);//移除元素
public abstract List<ProductComponent> getChlid();//获取子元素
public abstract long excute();
}
/**
* 简单元素
*/
public class LeafProduct extends ProductComponent{
public LeafProduct(String name, long price) {
super(name, price);
}
@Override
public boolean add(ProductComponent productComponent) {
return false;
}
@Override
public boolean remove(ProductComponent productComponent) {
return false;
}
@Override
public List<ProductComponent> getChlid() {
return null;
}
@Override
public long excute() {
System.out.println("==简单元素:name="+name+",price="+price);
return price;
}
}
/**
* 复杂元素
*/
public class CompositeProduct extends ProductComponent{
List<ProductComponent> childs;
public CompositeProduct(String name, long price) {
super(name, price);
childs = new ArrayList<ProductComponent>();
}
@Override
public boolean add(ProductComponent productComponent) {
return childs.add(productComponent);
}
@Override
public boolean remove(ProductComponent productComponent) {
return childs.remove(productComponent);
}
@Override
public List<ProductComponent> getChlid() {
return childs;
}
@Override
public long excute() {
System.out.println("--复杂元素:name="+name+",price="+price);
if(childs.size()!=0){
for (ProductComponent productComponent:childs){
price+=productComponent.excute();
}
}
return price;
}
}
public class TestComposite {
public static void main(String[] args) {
System.out.println("水果店买水果。。");
ProductComponent apple1 = new LeafProduct("大苹果",5l);
ProductComponent apple2 = new LeafProduct("小苹果",3l);
ProductComponent appleComposite = new CompositeProduct("苹果方便带",0l);
appleComposite.add(apple1);
appleComposite.add(apple2);
ProductComponent banana = new LeafProduct("香蕉-拼盘",2l);
ProductComponent pineapple = new LeafProduct("菠萝-拼盘",3l);
ProductComponent dragoFruit = new LeafProduct("火龙果-拼盘",4l);
ProductComponent fruitPlatter = new CompositeProduct("水果拼盘包装",1l);
fruitPlatter.add(banana);
fruitPlatter.add(pineapple);
fruitPlatter.add(dragoFruit);
ProductComponent fruitComposite = new CompositeProduct("大号方便袋",0l);
fruitComposite.add(appleComposite);
fruitComposite.add(fruitPlatter);
fruitComposite.excute();
System.out.println("水果总价:"+fruitComposite.price);
}
}
测试结果: