上一节说到代理模式:
https://blog.csdn.net/zhanglei082319/article/details/88672268
代理模式:代理者拥有委托人的部分权限,代理者也可以在代理的同时加上自己的部分业务
今天说一种新的设计模式:组合模式
组合模式: 对象自身包含其他对象的引用,以达到组合对象数据的效果
树形的数据结构生活中非常常见,比如国家城市县镇地址,公司部门子部门班组,盘符目录子目录文件等等。这种一层嵌套者一层的数据的构建,在java中,组合设计模式就起到了用武之地。
这里就以国家城市县镇例子,简单将组合模式用代码来实现。
1、先定义一个地址节点接口
/**
* 地址节点
*/
public interface Node {
/**
* 当前节点名称
*/
String name();
/**
* 父节点名称
*/
String parentName();
/**
* 子节点名称
*/
List<Node> childNode();
/**
* 添加子节点
*/
void addChildNode(Node childNode);
}
2、定义一个地址实现
/**
* 地址实现元素
*/
public class Element implements Node {
private String name;
/**
* 父节点名称
*/
private String parentName;
private List<Node> childNode = new LinkedList<>();
public Element(String name,String parentName){
this.name = name;
this.parentName = parentName;
}
@Override
public void addChildNode(Node child){
this.childNode.add(child);
}
@Override
public String name() {
return this.name;
}
@Override
public String parentName() {
return this.parentName;
}
@Override
public List<Node> childNode() {
return this.childNode;
}
}
3、定义叶子地址实现(就是没有子地址的地址)
/**
* 叶子地址
*/
public class Leaf implements Node {
private String name;
private String parentName;
public Leaf(String name,String parentName){
this.name = name;
this.parentName = parentName;
}
@Override
public String name() {
return this.name;
}
@Override
public String parentName() {
return this.parentName;
}
@Override
public List<Node> childNode() {
return null;
}
@Override
public void addChildNode(Node childNode) {
throw new UnsupportedOperationException("unspport");
}
}
最后我们来测试一下:
public static void main(String[] args) {
//主元素
Element shanghai = new Element("上海",null);
//子元素
Element pudong = new Element("浦东新区","上海");
Element huangpu = new Element("黄埔区","上海");
//孙元素
Leaf lujiazui = new Leaf("陆家嘴","浦东新区");
Leaf babaiban = new Leaf("八佰伴","浦东新区");
Leaf waitan = new Leaf("外滩","黄埔区");
//组合
pudong.addChildNode(lujiazui);
pudong.addChildNode(babaiban);
huangpu.addChildNode(waitan);
shanghai.addChildNode(pudong);
shanghai.addChildNode(huangpu);
System.out.println(shanghai);
}
执行结果如下:
这样一个简单的地址树形数据就完成了。
扩展一下,如果地址数量过多,可以进行循环递归构建树形数据,如下
private static Node build(List<Node> allNodes){
Node element = null;
Iterator<Node> iterator = allNodes.iterator();
while(iterator.hasNext()){
Node node = iterator.next();
if(node.parentName() == null){
element = node;
iterator.remove();
break;
}
}
recursion(allNodes,element);
return element;
}
private static void recursion(List<Node> allNodes,Node result){
Iterator<Node> iterator = allNodes.iterator();
while(iterator.hasNext()) {
Node node = iterator.next();
if(node.parentName().equals(result.name())){
result.addChildNode(node);
recursion(allNodes,node);
}
}
}
public static void main(String[] args) {
//主元素
Element shanghai = new Element("上海",null);
//子元素
Element pudong = new Element("浦东新区","上海");
Element huangpu = new Element("黄埔区","上海");
//孙元素
Leaf lujiazui = new Leaf("陆家嘴","浦东新区");
Leaf babaiban = new Leaf("八佰伴","浦东新区");
Leaf waitan = new Leaf("外滩","黄埔区");
List<Node> nodes = new LinkedList<>();
nodes.add(shanghai);
nodes.add(pudong);
nodes.add(huangpu);
nodes.add(lujiazui);
nodes.add(babaiban);
nodes.add(waitan);
Node element = build(nodes);
System.out.println();
}
执行结果如下,并没有变化。
以上
版权声明:本文为zhanglei082319原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。