在全部的树形结构中最适合的设计模式就是组合模式,咱们看看经常使用商品分类中如何使用。设计模式
先定义一个树形结构的商品接口ide
public interface TreeProduct { List<TreeProduct> allProducts(); boolean addProduct(TreeProduct product); boolean addProducts(List<TreeProduct> products); boolean removeProduct(TreeProduct product); }
咱们来定义一个商品分类的实现类this
@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); } }
而后定义一个商品类spa
@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的系统去改造这个模式设计
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}]}]}ci