在所有的树形结构中最适合的设计模式就是组合模式,我们看看常用商品分类中如何使用。
先定义一个树形结构的商品接口
代码语言:javascript复制public interface TreeProduct {
List<TreeProduct> allProducts();
boolean addProduct(TreeProduct product);
boolean addProducts(List<TreeProduct> products);
boolean removeProduct(TreeProduct product);
}
我们来定义一个商品分类的实现类
代码语言:javascript复制@NoArgsConstructor
@ToString
public class TypeProduct implements TreeProduct {
@Getter
@Setter
private Integer id;
@Getter
@Setter
private String name;
@Getter
private List<TreeProduct> treeProducts = new CopyOnWriteArrayList<>();
public TypeProduct(Integer id,String name) {
this.id = id;
this.name = name;
}
@Override
public List<TreeProduct> allProducts() {
return this.treeProducts;
}
@Override
public boolean addProduct(TreeProduct product) {
return treeProducts.add(product);
}
@Override
public boolean removeProduct(TreeProduct product) {
return treeProducts.remove(product);
}
@Override
public boolean addProducts(List<TreeProduct> products) {
return treeProducts.addAll(products);
}
}
然后定义一个商品类
代码语言:javascript复制@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Product implements TreeProduct {
private Integer id;
private String name;
private String model;
private BigDecimal price;
@Override
public List<TreeProduct> allProducts() {
return Arrays.asList(this);
}
@Override
public boolean addProduct(TreeProduct product) {
throw new RuntimeException("不支持此方法");
}
@Override
public boolean removeProduct(TreeProduct product) {
throw new RuntimeException("不支持此方法");
}
@Override
public boolean addProducts(List<TreeProduct> products) {
throw new RuntimeException("不支持此方法");
}
}
最后是main方法,当然你可以在Web的系统去改造这个模式
代码语言:javascript复制public class ProductMain {
public static void main(String[] args) {
TreeProduct root = new TypeProduct(100,"根目录");
TreeProduct type1 = new TypeProduct(200,"可乐");
TreeProduct type2 = new TypeProduct(300,"咖啡");
List<TreeProduct> types1 = new ArrayList<>();
types1.add(type1);
types1.add(type2);
TreeProduct product1 = new Product(1,"可口可乐","500ml",new BigDecimal(3));
TreeProduct product2 = new Product(2,"雀巢咖啡","600ml",new BigDecimal(6));
root.addProducts(types1);
type1.addProduct(product1);
type2.addProduct(product2);
System.out.println(JSON.toJSONString(root));
}
}
运行结果:
{"id":100,"name":"根目录","takeCareProducts":[{"id":200,"name":"可乐","takeCareProducts":[{"id":1,"model":"500ml","name":"可口可乐","price":3}]},{"id":300,"name":"咖啡","takeCareProducts":[{"id":2,"model":"600ml","name":"雀巢咖啡","price":6}]}]}