理清父类和子类之间的关系,是不是有层级关系。
定义根目录的类或者接口。
树枝类继承根类,实现里面的相关方法,树枝类可以将树叶类添加进树枝容器里面。
定义树叶类来实现根类,实现相关信息,这边注意的是树叶里面不能添加别的类到容器里面。
将对象返回,依次调用里面的方法。
我们以一个商品类和商品信息为例子,先创建一个根接口,来表示商品的共性信息,然后让商品的类别和具体的商品信息来实现该根接口。
创建的文件有 RootProduct.java
、ProductCategory.java
、 Product.java
和 TestMain.java
文件。 文件创建完毕,目录结构如下图:
RootProduct.java
文件代码如下:
package net.haicoder.composite;
import java.util.List;
public interface RootProduct {
List<RootProduct> allProducts();
boolean addProduct(RootProduct product);
boolean addProducts(List<RootProduct> products);
boolean removeProduct(RootProduct product);
}
ProductCategory.java
文件代码如下:
package net.haicoder.composite;
import java.util.ArrayList;
import java.util.List;
public class ProductCategory implements RootProduct {
private Integer id;
private String name;
private List<RootProduct> rootProducts = new ArrayList<RootProduct>();
public ProductCategory(Integer id, String name) {
this.id = id;
this.name = name;
}
public List<RootProduct> allProducts() {
return this.rootProducts;
}
public boolean addProduct(RootProduct product) {
return rootProducts.add(product);
}
public boolean addProducts(List<RootProduct> products) {
return rootProducts.addAll(products);
}
public boolean removeProduct(RootProduct product) {
return rootProducts.remove(product);
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<RootProduct> getRootProducts() {
return rootProducts;
}
public void setRootProducts(List<RootProduct> rootProducts) {
this.rootProducts = rootProducts;
}
}
Product.java
代码如下:
package net.haicoder.composite;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
public class Product implements RootProduct {
private Integer id;
private String name;
private String model;
private BigDecimal price;
public Product(Integer id, String name, String model, BigDecimal price) {
this.id = id;
this.name = name;
this.model = model;
this.price = price;
}
public List<RootProduct> allProducts() {
List<RootProduct> rootProducts = new ArrayList<RootProduct>();
rootProducts.add(this);
return rootProducts;
}
public boolean addProduct(RootProduct product) {
throw new RuntimeException("不支持此方法");
}
public boolean addProducts(List<RootProduct> products) {
throw new RuntimeException("不支持此方法");
}
public boolean removeProduct(RootProduct product) {
throw new RuntimeException("不支持此方法");
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
}
TestMain.java
代码如下:
package net.haicoder.composite;
import com.alibaba.fastjson.JSONObject;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
public class TestMain {
public static void main(String[] args) {
RootProduct rootProducts = new ProductCategory(1, "根目录");
RootProduct fruitsCategory = new ProductCategory(100, "水果类");
RootProduct winkCategory = new ProductCategory(200, "白酒类");
List<RootProduct> categorys = new ArrayList<RootProduct>();
categorys.add(fruitsCategory);
categorys.add(winkCategory);
rootProducts.addProducts(categorys);
Product fruidProduct = new Product(1, "苹果", "KG", new BigDecimal(20));
Product yanghe = new Product(2, "洋河", "450ML", new BigDecimal(200));
fruitsCategory.addProduct(fruidProduct);
winkCategory.addProduct(yanghe);
System.out.println("嗨客网(www.haicoder.net)");
System.out.println(JSONObject.toJSONString(rootProducts));
}
}
程序运行后,控制台输入如下:
设计模式中组合模式解耦了客户程序与复杂元素内部结构,让客户端不再区分操作的是组合对象还是叶子对象,从而使客户程序可以像处理简单元素一样来处理复杂元素。