文章目录
创建design-demo项目
项目代码:https://gitee.com/java_wxid/java_wxid/tree/master/demo/design-demo
项目结构如下(示例):
创建ItemController
代码如下(示例):
package com.example.designdemo.controller;
import com.example.designdemo.items.node.ProductItem;
import com.example.designdemo.service.ItemService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author: zhiwei Liao
* @Date: 2022/9/29 21:29
* @Description:
*/
@RestController
public class ItemController {
@Autowired
private ItemService itemService;
@GetMapping("get")
public ProductItem getItem() {
return itemService.getItem();
}
@PostMapping("del")
public ProductItem delItem(@RequestBody ProductItem productItem) {
return itemService.delItem(productItem);
}
@PostMapping("add")
public ProductItem addItem(@RequestBody ProductItem productItem) {
return itemService.addItem(productItem);
}
}
创建ItemService
代码如下(示例):
package com.example.designdemo.service;
import com.example.designdemo.items.node.ProductItem;
/**
* @Author: zhiwei Liao
* @Date: 2022/9/29 21:29
* @Description:
*/
public interface ItemService {
ProductItem getItem();
ProductItem delItem(ProductItem productItem);
ProductItem addItem(ProductItem productItem);
}
创建ItemServiceimpl
代码如下(示例):
package com.example.designdemo.service.impl;
import com.example.designdemo.MockDb;
import com.example.designdemo.items.node.ProductItem;
import com.example.designdemo.items.visitor.AddItemVisitor;
import com.example.designdemo.items.visitor.DelItemVisitor;
import com.example.designdemo.service.ItemService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @Author: zhiwei Liao
* @Date: 2022/9/29 21:29
* @Description:
*/
@Service
public class ItemServiceimpl implements ItemService {
@Autowired
private DelItemVisitor delItemVisitor;
@Autowired
private AddItemVisitor addItemVisitor;
//这部分只有初始化的时候获取一次 或者 直接预热到缓存中
public ProductItem getItem() {
System.out.println("从DB 获取所有的目录");
System.out.println("将数据组装为 ProductItem");
System.out.println("将组装好的 ProductItem 放入缓存中,永不过期 ");
return MockDb.ProductItem;
}
public ProductItem delItem(ProductItem productItem) {
ProductItem item = delItemVisitor.visitor(productItem);
MockDb.ProductItem = item;
System.out.println("update db");
return item;
}
public ProductItem addItem(ProductItem productItem) {
ProductItem item = addItemVisitor.visitor(productItem);
MockDb.ProductItem = item;
System.out.println("update db");
return item;
}
}
创建ItemVisitor
代码如下(示例):
package com.example.designdemo.items.visitor;
import com.example.designdemo.items.node.ProductItem;
/**
* @Author: zhiwei Liao
* @Date: 2022/9/29 21:29
* @Description:
*/
public interface ItemVisitor<T> {
T visitor(ProductItem productItem);
}
创建DelItemVisitor
代码如下(示例):
package com.example.designdemo.items.visitor;
import com.example.designdemo.MockDb;
import com.example.designdemo.items.node.ProductItem;
import org.springframework.stereotype.Component;
/**
* @Author: zhiwei Liao
* @Date: 2022/9/29 21:29
* @Description:
*/
@Component
public class DelItemVisitor implements ItemVisitor<ProductItem>{
// 入参是 id 2, pid为 1
@Override
public ProductItem visitor(ProductItem productItem) {
ProductItem currentItem = MockDb.ProductItem; // 从缓存来的 to do
if(productItem.getId() == currentItem.getId()) {
throw new UnsupportedOperationException("根节点不能删。");
}
if(productItem.getPid() == currentItem.getId()) {
currentItem.removeChild(productItem);
return currentItem;
}
delChild(productItem, currentItem);
return currentItem;
}
private void delChild(ProductItem productItem, ProductItem currentItem) {
for(ProductItem item : currentItem.getChild()) {
if(item.getId() == productItem.getPid()) {
item.removeChild(productItem);
break;
} else {
delChild(productItem, item);
}
}
}
}
创建AddItemVisitor
代码如下(示例):
package com.example.designdemo.items.visitor;
import com.example.designdemo.MockDb;
import com.example.designdemo.items.node.ProductItem;
import org.springframework.stereotype.Component;
/**
* @Author: zhiwei Liao
* @Date: 2022/9/29 21:29
* @Description:
*/
@Component
public class AddItemVisitor implements ItemVisitor<ProductItem>{
// 入参是 id 2, pid为 1
@Override
public ProductItem visitor(ProductItem productItem) {
ProductItem currentItem = MockDb.ProductItem; // 从缓存来的 to do
if(productItem.getId() == currentItem.getId()) {
throw new UnsupportedOperationException("根节点是唯一的。");
}
if(productItem.getPid() == currentItem.getId()) {
currentItem.addChild(productItem);
return currentItem;
}
addChild(productItem, currentItem);
return currentItem;
}
private void addChild(ProductItem productItem, ProductItem currentItem) {
for(ProductItem item : currentItem.getChild()) {
if(item.getId() == productItem.getPid()) {
item.addChild(productItem);
break;
} else {
addChild(productItem, item);
}
}
}
}
创建ProductItem
代码如下(示例):
package com.example.designdemo.items.node;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* @Author: zhiwei Liao
* @Date: 2022/9/29 21:29
* @Description:
*/
public class ProductItem extends AbstractProductItem{
private int id;
private int pid;
private String name;
private List<ProductItem> child = new ArrayList<>();
@Override
public void removeChild(AbstractProductItem item) {
ProductItem removeItem = (ProductItem) item;
this.child = child.stream().filter(x->x.getId() != removeItem.getId()).collect(Collectors.toList());
}
@Override
public void addChild(AbstractProductItem item) {
this.child.add((ProductItem) item);
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getPid() {
return pid;
}
public void setPid(int pid) {
this.pid = pid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<ProductItem> getChild() {
return child;
}
public void setChild(List<ProductItem> child) {
this.child = child;
}
}
创建AbstractProductItem
代码如下(示例):
package com.example.designdemo.items.node;
/**
* @Author: zhiwei Liao
* @Date: 2022/9/29 21:29
* @Description:
*/
public abstract class AbstractProductItem {
public abstract void removeChild(AbstractProductItem item);
public abstract void addChild(AbstractProductItem item);
}
创建MockDb
代码如下(示例):
package com.example.designdemo;
import com.example.designdemo.items.node.ProductItem;
import java.util.ArrayList;
import java.util.List;
/**
* @Author: zhiwei Liao
* @Date: 2022/9/29 21:29
* @Description:
*/
public class MockDb {
public static com.example.designdemo.items.node.ProductItem ProductItem = new ProductItem();
static {
ProductItem.setId(1);
ProductItem.setPid(0);
ProductItem.setName("书籍");
List<ProductItem> child = new ArrayList<>();
ProductItem c1 = new ProductItem();
c1.setId(2);
c1.setPid(1);
c1.setName("技术书籍");
ProductItem c2 = new ProductItem();
c2.setId(3);
c2.setPid(1);
c2.setName("历史书籍");
List<ProductItem> child1 = new ArrayList<>();
ProductItem c3 = new ProductItem();
c3.setId(4);
c3.setPid(2);
c3.setName("并发编程");
ProductItem c4 = new ProductItem();
c4.setId(5);
c4.setPid(2);
c4.setName("JVM");
child1.add(c3);
child1.add(c4);
c1.setChild(child1);
child.add(c1);
child.add(c2);
ProductItem.setChild(child);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2021-10-11 RabbitMQ:第四章:RabbitMQ集群搭建