组合模式设计模式实现

组合模式实现步骤

  1. 理清父类和子类之间的关系,是不是有层级关系。

  2. 定义根目录的类或者接口。

  3. 树枝类继承根类,实现里面的相关方法,树枝类可以将树叶类添加进树枝容器里面。

  4. 定义树叶类来实现根类,实现相关信息,这边注意的是树叶里面不能添加别的类到容器里面。

  5. 将对象返回,依次调用里面的方法。

案例

我们以一个商品类和商品信息为例子,先创建一个根接口,来表示商品的共性信息,然后让商品的类别和具体的商品信息来实现该根接口。

创建的文件有 RootProduct.javaProductCategory.javaProduct.javaTestMain.java 文件。 文件创建完毕,目录结构如下图:

11 组合模式代码结构图.png

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

程序运行后,控制台输入如下:

12 组合模式运行结果图.png

组合模式总结

设计模式中组合模式解耦了客户程序与复杂元素内部结构,让客户端不再区分操作的是组合对象还是叶子对象,从而使客户程序可以像处理简单元素一样来处理复杂元素。